xusl 5 hónapja
szülő
commit
0da314daf4

+ 172 - 7
cpp-admin/src/main/java/com/cpp/web/controller/largeScreen/LargeScreenController.java

@@ -2,6 +2,7 @@ package com.cpp.web.controller.largeScreen;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.cpp.common.core.cache.LocalCache;
 import com.cpp.common.core.domain.R;
@@ -23,7 +24,6 @@ import com.cpp.web.service.station.*;
 import com.cpp.web.utils.DateTimeUtil;
 import com.cpp.web.utils.LatestDataUtil;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang.time.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -31,6 +31,8 @@ import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -74,6 +76,7 @@ public class LargeScreenController {
     public R getBizData(String forecastDay, String forecastType, String accuracyType) {
         // 获取所有场站
         List<ElectricField> electricFieldList = electricFieldService.list();
+
         // 首页左上角场站数据统计
         // 统计开机容量累计值
         BigDecimal gfOpenCapacitySum = BigDecimal.ZERO;
@@ -124,6 +127,7 @@ public class LargeScreenController {
             wsAvg = wsSum.divide(new BigDecimal(wsSumCount), 2, BigDecimal.ROUND_HALF_UP);
         }
         electricFieldDataTotalDto.setWsAvg(wsAvg);
+
         Map bizDataMap = new HashMap();
         bizDataMap.put("electricFieldDataTotalDto", electricFieldDataTotalDto);
         // 计算生成数据
@@ -133,14 +137,17 @@ public class LargeScreenController {
         Map forecastGeneratingMap = calForecastGenerating();
         bizDataMap.put("forecastGeneratingMap", forecastGeneratingMap);
         // 获取首页中心侧nwp气象
-        Map<String, List> forecastNwpMap = centerForecastNwpAvgTotal();
+        Map<String, List> forecastNwpMap = centerForecastNwpAvgTotal(electricFieldList);
         bizDataMap.put("forecastNwpMap", forecastNwpMap);
         //////////////// 获取首页预测对比数据 ///////////////
         Map<String, List> curveMap = getForecastContrast(forecastDay, forecastType);
         bizDataMap.put("curveMap", curveMap);
         /////////////// 获取首页准确率排名 ///////////////
-        Map<String, List<AccuracyRankingDto>> accuracyRankingMap = accuracyRanking();
+        Map<String, List<AccuracyRankingDto>> accuracyRankingMap = accuracyRanking(electricFieldList);
         bizDataMap.put("accuracyRankingMap", accuracyRankingMap);
+        //////////////  获取首页地图数据 //////////////
+        Map mapDataMap = mapData(electricFieldList);
+        bizDataMap.put("mapDataMap", mapDataMap);
 
 
         return R.ok(bizDataMap);
@@ -287,10 +294,9 @@ public class LargeScreenController {
      *
      * @return
      */
-    private Map<String, List> centerForecastNwpAvgTotal() {
+    private Map<String, List> centerForecastNwpAvgTotal(List<ElectricField> list) {
         // 根据类型获取所有场站
         Map<String, List> stationMap = new HashMap();
-        List<ElectricField> list = electricFieldService.list();
         List<String> windStationCodeList = new ArrayList<>();
         List<String> gfStationCodeList = new ArrayList<>();
         for (ElectricField electricField : list) {
@@ -634,7 +640,7 @@ public class LargeScreenController {
      *
      * @return
      */
-    private Map<String, List<AccuracyRankingDto>> accuracyRanking() {
+    private Map<String, List<AccuracyRankingDto>> accuracyRanking(List<ElectricField> list) {
         Map<String, List<AccuracyRankingDto>> accuracyMap = new HashMap();
         // 昨日时间段
         Date startTime = DateTimeUtil.getDayStartTime(DateUtil.yesterday().getTime());
@@ -642,7 +648,7 @@ public class LargeScreenController {
         // 上个月时间段
         Date lastMonthStartTime = DateTimeUtil.getMonthStartTime(System.currentTimeMillis());
         Date lastMonthEndTime = DateTimeUtil.getMonthLastTime(System.currentTimeMillis());
-        List<ElectricField> list = electricFieldService.list();
+
         // 先查询昨日的准确率
         String dqHowLongAgo = configService.selectConfigByKey("dqHowLongAgo");
         QueryWrapper<AccuracyPassRate> accuracyPassRateQueryWrapper = new QueryWrapper<>();
@@ -726,4 +732,163 @@ public class LargeScreenController {
 
         return accuracyMap;
     }
+
+    /**
+     * 首页地图数据展示
+     *
+     * @return
+     */
+    private Map mapData(List<ElectricField> list) {
+        List<String> stationCodeList = list.stream().map(ElectricField::getStationCode).collect(Collectors.toList());
+        // 获取当前时刻所有场站短期数据
+        Date dqMomentDate = DateTimeUtil.getMomentTimeFor15Minute(System.currentTimeMillis());
+        QueryWrapper dqsbWrapper = new QueryWrapper<>();
+        dqsbWrapper.eq("time", dqMomentDate);
+        dqsbWrapper.in("station_code", stationCodeList);
+        List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList = forecastPowerShortTermRegulationService.list(dqsbWrapper);
+        // 按场站分组
+        Map<String, List<ForecastPowerShortTermRegulation>> shortTermDataGroupByStationCode = forecastPowerShortTermRegulationList.stream().collect(Collectors.groupingBy(ForecastPowerShortTermRegulation::getStationCode));
+        // 超短期
+        QueryWrapper cdqsbWrapper = new QueryWrapper<>();
+        cdqsbWrapper.eq("time", dqMomentDate);
+        cdqsbWrapper.in("station_code", stationCodeList);
+        List<ForecastPowerUltraShortTermRegulation> forecastPowerUltraShortTermRegulationList = forecastPowerUltraShortTermRegulationService.list(cdqsbWrapper);
+        // 按场站分组
+        Map<String, List<ForecastPowerUltraShortTermRegulation>> ultraShortTermDataGroupByStationCode = forecastPowerUltraShortTermRegulationList.stream().collect(Collectors.groupingBy(ForecastPowerUltraShortTermRegulation::getStationCode));
+
+        List<MapDtaDto> mapDataDtoList = new ArrayList();
+        // 首页地图限电场站统计
+        int xdcoutns = 0;
+        // 通讯状态个数
+        int txcoutns = 0;
+        // 检修状态个数
+        int jxcoutns = 0;
+        // 运行状态个数
+        int yxcoutns = 0;
+        // 遍历所有场站封装地图展示的数据
+        for (ElectricField electricField : list) {
+            MapDtaDto mapDtaDto = new MapDtaDto();
+            mapDtaDto.setName(electricField.getName());
+            mapDtaDto.setStationCode(electricField.getStationCode());
+            mapDtaDto.setStationType(electricField.getElectricFieldTypeEnum());
+            mapDtaDto.setCapacity(electricField.getCapacity().setScale(2, RoundingMode.HALF_UP).toString());
+            mapDtaDto.setLeft(electricField.getMapLeft());
+            mapDtaDto.setTop(electricField.getMapTop());
+            if (shortTermDataGroupByStationCode.get(electricField.getStationCode())!=null){
+                List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList1 = shortTermDataGroupByStationCode.get(electricField.getStationCode());
+                // 再对场站多条预测记录,按howlongago排序,先获取数值小的。
+                forecastPowerShortTermRegulationList1.sort(Comparator.comparing(ForecastPowerShortTermRegulation::getForecastHowLongAgo));
+                mapDtaDto.setDq(forecastPowerShortTermRegulationList1.get(0).getFpValue().toString());
+            }
+            else{
+                mapDtaDto.setDq("0.00");
+            }
+            if (ultraShortTermDataGroupByStationCode.get(electricField.getStationCode())!=null){
+                List<ForecastPowerUltraShortTermRegulation> forecastPowerShortTermRegulationList1 = ultraShortTermDataGroupByStationCode.get(electricField.getStationCode());
+                // 再对场站多条预测记录,按howlongago排序,先获取数值小的。
+                forecastPowerShortTermRegulationList1.sort(Comparator.comparing(ForecastPowerUltraShortTermRegulation::getForecastHowLongAgo));
+                mapDtaDto.setCdq(forecastPowerShortTermRegulationList1.get(0).getFpValue().toString());
+            }
+            else{
+                mapDtaDto.setCdq("0.00");
+            }
+
+            // 实际、可用、理论
+            PowerStationStatusData powerStationStatusData = LatestDataUtil.getData(electricField.getStationCode(), PowerStationStatusData.class);
+            if (powerStationStatusData != null) {
+                mapDtaDto.setSjgl(powerStationStatusData.getRealValue().toString());
+                mapDtaDto.setKygl(powerStationStatusData.getAbleValue().toString());
+                mapDtaDto.setLlgl(powerStationStatusData.getTheoryValue().toString());
+            }
+            else{
+                mapDtaDto.setSjgl("0.00");
+                mapDtaDto.setKygl("0.00");
+                mapDtaDto.setLlgl("0.00");
+            }
+            if (electricField.getElectricFieldTypeEnum().equals("E2")){
+                // 风
+                WindTowerStatusData windTowerStatusData = LatestDataUtil.getData(electricField.getStationCode(), WindTowerStatusData.class);
+                if (windTowerStatusData != null) {
+                   mapDtaDto.setHj(windTowerStatusData.getWsHubHeight().toString());
+                }
+                else{
+                    mapDtaDto.setHj("0.00");
+                }
+            }
+            else{
+                // 光
+                WeatherStationStatusData weatherStationStatusData = LatestDataUtil.getData(electricField.getStationCode(), WeatherStationStatusData.class);
+                if (weatherStationStatusData != null) {
+                   mapDtaDto.setHj(weatherStationStatusData.getGlobalR().toString());
+                }
+                else{
+                    mapDtaDto.setHj("0.00");
+                }
+            }
+
+            // 判断场站状态,先获取是否通讯
+            boolean isCommunication = false;
+            if (!isCommunication){
+                // 无通讯
+                mapDtaDto.setStatus("无通讯");
+                txcoutns++;
+            }
+            else{
+                // 判断是否检修
+                if (powerStationStatusData != null) {
+                    // 获取站内受阻容量
+                    BigDecimal blockedCapacity = powerStationStatusData.getBlockedCapacity();
+                    if (blockedCapacity.compareTo(electricField.getCapacity().multiply(new BigDecimal(0.5)))>0){
+                        // 超出装机50%容量,认为检修
+                        mapDtaDto.setStatus("检修");
+                        jxcoutns++;
+                    }
+                    else{
+                        // 未超过50%,判断是否限电
+                        if (powerStationStatusData.getPowerRationing().intValue()==1){
+                            // 限电
+                            mapDtaDto.setStatus("限电");
+                            xdcoutns++;
+                        }
+                        else{
+                            mapDtaDto.setStatus("运行");
+                            yxcoutns++;
+                        }
+                    }
+                }
+                else{
+                    // 没找到实际功率记录,认为场站正常状态
+                    mapDtaDto.setStatus("运行");
+                    yxcoutns++;
+                }
+            }
+            mapDataDtoList.add(mapDtaDto);
+        }
+        Map mapDataMap = new HashMap();
+        mapDataMap.put("mapDataDtoList",mapDataDtoList);
+        mapDataMap.put("xdcoutns",xdcoutns);
+        mapDataMap.put("txcoutns",txcoutns);
+        mapDataMap.put("jxcoutns",jxcoutns);
+        mapDataMap.put("yxcoutns",yxcoutns);
+        // 获取系统运行开始日期(yyyy-MM-dd)
+        int runDays = 66;
+        String systemRunDate = configService.selectConfigByKey("systemRunDate");
+        try{
+            // 计算系统运行天数
+            LocalDate date1 = LocalDate.parse(systemRunDate);
+            LocalDate date2 = LocalDate.parse(DateUtil.today());
+            long days = ChronoUnit.DAYS.between(date1, date2);
+            runDays = (int)(days+1);
+        }
+        catch (Exception e){
+            e.printStackTrace();
+        }
+        mapDataMap.put("runDays",runDays);
+
+
+
+
+
+        return mapDataMap;
+    }
 }

+ 42 - 0
cpp-admin/src/main/java/com/cpp/web/dto/largeScreen/MapDtaDto.java

@@ -0,0 +1,42 @@
+package com.cpp.web.dto.largeScreen;
+
+import lombok.Data;
+
+/**
+ * 首页地图数据
+ *
+ * @author jy
+ * @since 2024/11/18
+ */
+@Data
+public class MapDtaDto {
+    //  场站名称
+    private String name;
+    // 场站编号
+    private String stationCode;
+    // 场站类型
+    private String stationType;
+    // 当前状态
+    private String status;
+    // 装机容量
+    private String capacity;
+    // 当前环境值(风:风速,光:辐照度)
+    private String hj;
+    // 实际功率
+    private String sjgl;
+    // 短期
+    private String dq;
+    // 超短期
+    private String cdq;
+    // 可用功率
+    private String kygl;
+    // 理论功率
+    private String llgl;
+    // 地图左边距
+    private String left;
+    // 地图上边距
+    private String top;
+
+
+
+}

+ 59 - 36
cpp-ui/src/views/largeScreen/components/center-top.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="center-top_container">
+  <div class="center-top_container position-r ">
     <div class="position-a sign-container">
       <div class="flex items-center">
         <div class="sign-style mr-0vw green"/>
@@ -33,43 +33,60 @@
 export default {
   data() {
     return {
-      runningDays: 365,
-      run: 2,
+      runningDays: '',
+      run: 0,
       limit: 0,
       overhaul: 0,
       noCommunication: 0,
       // 场站状态暂定: 运行:1 限电:2 检修:3 无通讯;0
       // left top 需要存数据库代替经纬度在图片上打点
-      stationInfo: [
-        {
-          name: '新疆测试场站信息',
-          stationCode: 'J01100',
-          status: '2',
-          capacity: '99.52',
-          ws: '12',
-          sjgl: '12',
-          dq: '12',
-          cdq: 12,
-          kygl: 12,
-          llgl: 12,
-          left: 24.7,
-          top: 14.5
-        },
-        {
-          name: '光电',
-          stationCode: 'J01101',
-          status: '1',
-          capacity: '99.52',
-          ws: '12',
-          sjgl: '12',
-          dq: '12',
-          cdq: 12,
-          kygl: 12,
-          llgl: 12,
-          left: 29,
-          top: 25
-        }
-      ]
+      stationInfo:[],
+      // stationInfo: [
+      //   {
+      //     name: '新疆测试场站信息',
+      //     stationCode: 'J01100',
+      //     status: '2',
+      //     capacity: '99.52',
+      //     ws: '12',
+      //     sjgl: '12',
+      //     dq: '12',
+      //     cdq: 12,
+      //     kygl: 12,
+      //     llgl: 12,
+      //     left: 24.7,
+      //     top: 14.5
+      //   },
+      //   {
+      //     name: '光电',
+      //     stationCode: 'J01101',
+      //     status: '1',
+      //     capacity: '99.52',
+      //     ws: '12',
+      //     sjgl: '12',
+      //     dq: '12',
+      //     cdq: 12,
+      //     kygl: 12,
+      //     llgl: 12,
+      //     left: 29,
+      //     top: 25
+      //   }
+      // ]
+    }
+  },
+  props: {
+    params: {type: Object}
+  },
+  watch: {
+    params: {
+      // immediate: true,// 第一次立即监听
+      handler(value) {
+        this.stationInfo = value.mapDataDtoList
+        this.runningDays = value.runDays
+        this.run = value.yxcoutns
+        this.limit = value.xdcoutns
+        this.overhaul = value.jxcoutns
+        this.noCommunication = value.txcoutns
+      }
     }
   },
   mounted() {
@@ -84,9 +101,15 @@ export default {
      * 创建tips
      * */
     mousemoveRows(row) {
+      let hjLabel = '轮毂风速';
+      if (row.stationType=='E1'){
+        // 光
+        hjLabel = '总辐射';
+      }
+
       let status = Number(row.status) === 1?'运行':Number(row.status) === 2?'限电':Number(row.status) === 3?'检修':'无通讯'
-      let content = `${row.name}<br/>当前状态:${status}<br/>容量状态:${row.capacity} MW<br/>平均风速:${row.ws} m/s<br/>实时功率:${row.sjgl} MW<br/>短期与功率:${row.dq} MW<br/>
-                     超短期与功率:${row.cdq} MW<br/>可用功率:${row.kygl} MW<br/>理论功率:${row.llgl} MW`
+      let content = `${row.name}<br/>当前状态:${status}<br/>容量状态:${row.capacity} MW<br/>`+hjLabel+`:${row.hj} m/s<br/>实时功率:${row.sjgl} MW<br/>短期功率:${row.dq} MW<br/>
+                     超短期功率:${row.cdq} MW<br/>可用功率:${row.kygl} MW<br/>理论功率:${row.llgl} MW`
       this.createTips(row, content)
     },
 
@@ -100,7 +123,7 @@ export default {
         max-height: 400px;
         position: absolute;
         top: ${Number(row.top) + 1}vh;
-        left: ${Number(row.left+.5)}vw;
+        left: ${Number(row.left)+.5}vw;
         padding:.5vh .6vw;
         overflow: auto;
         font-size: .7vw;

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

@@ -72,7 +72,7 @@
       <div class="width-48 mr-0 ml-0">
         <div class="height-58vh">
           <div class="position-r height-58vh centerMap">
-            <center-top />
+            <center-top :params="centerTopParams"/>
           </div>
         </div>
         <div class="border-style position-r" style="margin-top: 1%">
@@ -509,7 +509,8 @@ export default {
       rightTopParams: {}, // 准确率排名
       centerBottomParams: {},//功率曲线
       rightMiddleParams: {},//气象预测
-      leftBottomParams: {}//短期偏差统计
+      leftBottomParams: {},//短期偏差统计
+      centerTopParams: {},//地图数据
 
 
     }
@@ -612,20 +613,19 @@ export default {
         }
         // 准确率排名
         this.rightTopParams = response.data.accuracyRankingMap
-
-
-
-        // 限电信息
-        let xdMap = response.data.xdMap
-        this.totality.number = xdMap.zczs
-        this.totality.capacity = xdMap.totalCapacity
-        this.xdczs = xdMap.xdczs
-        this.zczs = xdMap.zczs
-        this.xdbl = xdMap.xdbl
-        // 风速、辐照度平均值
-        let envDataMap = response.data.envDataMap
-        this.envData.ws = envDataMap.wsAvg
-        this.envData.radiance = envDataMap.fzdAvg
+        this.centerTopParams = response.data.mapDataMap
+
+        // // 限电信息
+        // let xdMap = response.data.xdMap
+        // this.totality.number = xdMap.zczs
+        // this.totality.capacity = xdMap.totalCapacity
+        // this.xdczs = xdMap.xdczs
+        // this.zczs = xdMap.zczs
+        // this.xdbl = xdMap.xdbl
+        // // 风速、辐照度平均值
+        // let envDataMap = response.data.envDataMap
+        // this.envData.ws = envDataMap.wsAvg
+        // this.envData.radiance = envDataMap.fzdAvg
       }).catch(err => {
         clearInterval(this.sysBizDataTimer);
       })