Browse Source

添加适配器stat(区间数据,avg,min,max实体类)

malijun 1 năm trước cách đây
mục cha
commit
1df1a46814

+ 10 - 0
electricity/meter/src/main/java/com/gyee/gaia/meter/adapter/Adapter.java

@@ -1,6 +1,7 @@
 package com.gyee.gaia.meter.adapter;
 
 import com.gyee.gaia.meter.entity.PointData;
+import com.gyee.gaia.meter.entity.PointDatas;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -36,6 +37,15 @@ public interface Adapter {
             @RequestParam(value = "interval", required = false) Integer interval
     );
 
+    //获取一个测点指定时间段内的数据(可以设置间隔时间单位S)
+    @GetMapping("/history/stat")
+    List<PointDatas> getHistoryStat(
+            @RequestParam(value = "tagName", required = false) String tagName,
+            @RequestParam(value = "startTs", required = false) Long startTs,
+            @RequestParam(value = "endTs", required = false) Long endTs,
+            @RequestParam(value = "interval", required = false) Integer interval
+    );
+
 
     //获取一个测点指定时间段内的数据
     @GetMapping("/history/raw")

+ 13 - 0
electricity/meter/src/main/java/com/gyee/gaia/meter/entity/AvgData.java

@@ -0,0 +1,13 @@
+package com.gyee.gaia.meter.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class AvgData implements Serializable {
+    private long ts;
+    private int status;
+    private double value;
+    private double doubleValue;
+}

+ 13 - 0
electricity/meter/src/main/java/com/gyee/gaia/meter/entity/MaxData.java

@@ -0,0 +1,13 @@
+package com.gyee.gaia.meter.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class MaxData implements Serializable {
+    private long ts;
+    private int status;
+    private double value;
+    private double doubleValue;
+}

+ 13 - 0
electricity/meter/src/main/java/com/gyee/gaia/meter/entity/MinData.java

@@ -0,0 +1,13 @@
+package com.gyee.gaia.meter.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class MinData implements Serializable {
+    private long ts;
+    private int status;
+    private double value;
+    private double doubleValue;
+}

+ 20 - 0
electricity/meter/src/main/java/com/gyee/gaia/meter/entity/PointDatas.java

@@ -0,0 +1,20 @@
+package com.gyee.gaia.meter.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 时序数据库返回测点数据
+ * </p>
+ */
+@Data
+public class PointDatas implements Serializable {
+
+    private AvgData avg;
+    private MaxData max;
+    private MinData min;
+
+}
+

+ 243 - 39
electricity/meter/src/main/java/com/gyee/gaia/meter/service/saveTDengine/TDSaveLLFDL1MinTest.java

@@ -4,10 +4,7 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.gyee.gaia.meter.adapter.Adapter;
-import com.gyee.gaia.meter.entity.Equipment;
-import com.gyee.gaia.meter.entity.ModelPowerDetails;
-import com.gyee.gaia.meter.entity.PointData;
-import com.gyee.gaia.meter.entity.TestingPoint;
+import com.gyee.gaia.meter.entity.*;
 import com.gyee.gaia.meter.service.impl.EquipmentServiceImpl;
 import com.gyee.gaia.meter.service.impl.ModelPowerDetailsServiceImpl;
 import com.gyee.gaia.meter.service.impl.TestingPointServiceImpl;
@@ -97,6 +94,23 @@ class TDSaveLLFDL1MinTest {
             }
         }
 
+
+        //根据uniform_code=AI130从testing_point表中获取到风机的实际功率测点
+        List<TestingPoint> testingPointList1 = testingPointService.list(new QueryWrapper<TestingPoint>()
+                .eq("uniform_code", "AI022")
+        );
+        //遍历testingPointList1,把code取出放入一个string集合
+        List<String> codeList1 = new ArrayList<>();
+        for (TestingPoint testingPoint : testingPointList1) {
+            String code = testingPoint.getCode();
+            codeList1.add(code);
+        }
+        //遍历codeList作为适配器的参数,获取到1分钟实际平均功率
+        for (String code : codeList1) {
+            List<PointDatas> pointDataList = adapter.getHistoryStat(code, startDateTime.getTime(), endDateTime.getTime(), 60);
+
+        }
+
         //根据uniform_code=AI022从testing_point表中获取到风机的风速测点
         List<TestingPoint> testingPointList = testingPointService.list(new QueryWrapper<TestingPoint>()
                 .eq("uniform_code", "AI022")
@@ -113,7 +127,7 @@ class TDSaveLLFDL1MinTest {
 
         //遍历codeList作为适配器的参数,获取到1分钟平均风速
         for (String code : codeList) {
-            List<PointData> pointDataList = adapter.getHistorySnap(code, startDateTime.getTime(), endDateTime.getTime(), 60);
+            List<PointDatas> pointDataList = adapter.getHistoryStat(code, startDateTime.getTime(), endDateTime.getTime(), 60);
 
             //遍历testingPointList,根据code取到风机编码thing_id
             for (TestingPoint testingPoint : testingPointList) {
@@ -128,24 +142,24 @@ class TDSaveLLFDL1MinTest {
                             //根据modelId从map中取出map集合,键为speed,值为theory_power
                             Map<BigDecimal, Double> map2 = map.get(modelId);
                             //遍历pointDataList,拿到风速,根据风速从map2中取到理论功率,计算1分钟理论发电量
-                            for (PointData pointData : pointDataList) {
+                            for (PointDatas pointData : pointDataList) {
                                 //风速
-                                double speed0 = pointData.getValue();
+                                double speed0 = pointData.getAvg().getValue();
                                 BigDecimal speed = new BigDecimal(speed0).setScale(2, RoundingMode.HALF_EVEN);
 
                                 Double theoryPower = 0.0;
-                                if (speed0 >= 3) {
+                                if (speed0 >= 3 && speed0 <= 25) {
                                     //理论功率
                                     theoryPower = map2.get(speed);
                                 }
                                 //时间
-                                DateTime dateTime = DateTime.of(pointData.getTs());
+                                DateTime dateTime = DateTime.of(pointData.getAvg().getTs());
 
 
-                                BigDecimal llfdl= BigDecimal.valueOf(0);
+                                BigDecimal llfdl = BigDecimal.valueOf(0);
                                 //1分钟理论发电量
-                                if(theoryPower != null){
-                                     llfdl = new BigDecimal(Double.toString(theoryPower))
+                                if (theoryPower != null) {
+                                    llfdl = new BigDecimal(Double.toString(theoryPower))
                                             .multiply(new BigDecimal(Double.toString(1)))
                                             .divide(new BigDecimal(Double.toString(60)), 2, RoundingMode.HALF_UP);
                                 }
@@ -175,46 +189,236 @@ class TDSaveLLFDL1MinTest {
         }
 
         HashMap<String, BigDecimal> map2 = new HashMap<>();
-        for (String key: map1.keySet() ){
+        for (String key : map1.keySet()) {
             Map<Long, BigDecimal> mapValues = map1.get(key);
-            BigDecimal llfdl= BigDecimal.valueOf(0);
-            for (BigDecimal mapValue : mapValues.values() ) {
-                llfdl=llfdl.add(mapValue);
+            BigDecimal llfdl = BigDecimal.valueOf(0);
+            for (BigDecimal mapValue : mapValues.values()) {
+                llfdl = llfdl.add(mapValue);
             }
-            map2.put(key,llfdl);
+            map2.put(key, llfdl);
         }
-        System.out.println(map2);
 
-        BigDecimal mhsllfdl= BigDecimal.valueOf(0);
-        BigDecimal nssllfdl= BigDecimal.valueOf(0);
-        BigDecimal qsllfdl= BigDecimal.valueOf(0);
-        BigDecimal sbqllfdl= BigDecimal.valueOf(0);
-        BigDecimal xsllfdl= BigDecimal.valueOf(0);
+        BigDecimal mhsllfdl = BigDecimal.valueOf(0);
+        BigDecimal nssllfdl = BigDecimal.valueOf(0);
+        BigDecimal qsllfdl = BigDecimal.valueOf(0);
+        BigDecimal sbqllfdl = BigDecimal.valueOf(0);
+        BigDecimal xsllfdl = BigDecimal.valueOf(0);
 
-        for (String key: map2.keySet()) {
-            if(key.contains("NX_GDDL_MHS_F_WT_")){
-                mhsllfdl=mhsllfdl.add(map2.get(key));
+        for (String key : map2.keySet()) {
+            if (key.contains("NX_GDDL_MHS_F_WT_")) {
+                mhsllfdl = mhsllfdl.add(map2.get(key));
             }
-            if(key.contains("NX_GDDL_NSS_F_WT_")){
-                nssllfdl=nssllfdl.add(map2.get(key));
+            if (key.contains("NX_GDDL_NSS_F_WT_")) {
+                nssllfdl = nssllfdl.add(map2.get(key));
             }
-            if(key.contains("NX_GDDL_QS_F_WT_")){
-                qsllfdl=qsllfdl.add(map2.get(key));
+            if (key.contains("NX_GDDL_QS_F_WT_")) {
+                qsllfdl = qsllfdl.add(map2.get(key));
             }
-            if(key.contains("NX_GDDL_SBQ_F_WT_")){
-                sbqllfdl=sbqllfdl.add(map2.get(key));
+            if (key.contains("NX_GDDL_SBQ_F_WT_")) {
+                sbqllfdl = sbqllfdl.add(map2.get(key));
             }
-            if(key.contains("NX_GDDL_XS_F_WT_")){
-                xsllfdl=xsllfdl.add(map2.get(key));
+            if (key.contains("NX_GDDL_XS_F_WT_")) {
+                xsllfdl = xsllfdl.add(map2.get(key));
+            }
+
+
+        }
+        System.out.println("麻黄山理论发电量:" + mhsllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+        System.out.println("牛首山理论发电量:" + nssllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+        System.out.println("青山理论发电量:" + qsllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+        System.out.println("石板泉理论发电量:" + sbqllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+        System.out.println("香山理论发电量:" + xsllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+
+
+
+
+    }
+
+    //理论发电量
+    @Test
+    public void llfdl_1Min1() {
+
+        //设置取值开始时间
+        String startString = startTimeString;
+        DateTime startDateTime = DateUtil.parse(startString);
+
+        //设置取值结束时间
+        String endDateString = endTimeString;
+        DateTime endDateTime0 = DateUtil.parse(endDateString);
+        DateTime endDateTime = DateUtil.endOfDay(endDateTime0);
+
+        //从pro_basic_equipment(实体类为Equipment)表中获取到所有风机,每台风机型号等
+        List<Equipment> equipmentList = equipmentService.list(new QueryWrapper<Equipment>()
+                .eq("spare1", "WT")
+        );
+
+        //model_power_details表中获取到所有型号各风速对应的理论功率
+        List<ModelPowerDetails> modelPowerDetailsList = modelPowerDetailsService.list();
+
+        //遍历modelPowerDetailsList,放入map集合中,键为model_id,值为map集合,值的map集合的键为speed,值为theory_power
+        Map<String, Map<BigDecimal, Double>> map = new HashMap<>();
+        for (ModelPowerDetails modelPowerDetails : modelPowerDetailsList) {
+            String modelId = modelPowerDetails.getModelId();
+            double speed0 = modelPowerDetails.getSpeed();
+            BigDecimal speed = new BigDecimal(speed0).setScale(2, RoundingMode.HALF_EVEN);
+            Double theoryPower = modelPowerDetails.getTheoryPower();
+
+            // 检查是否已存在该modelId的映射关系
+            if (map.containsKey(modelId)) {
+                // 如果已存在,获取对应的内层HashMap,并添加新的映射关系
+                Map<BigDecimal, Double> innerMap = map.get(modelId);
+                innerMap.put(speed, theoryPower);
+            } else {
+                // 如果不存在,创建新的内层HashMap,并添加映射关系
+                Map<BigDecimal, Double> innerMap = new HashMap<>();
+                innerMap.put(speed, theoryPower);
+                map.put(modelId, innerMap);
             }
+        }
 
 
+        //根据uniform_code=AI130从testing_point表中获取到风机的实际功率测点
+        List<TestingPoint> testingPointList1 = testingPointService.list(new QueryWrapper<TestingPoint>()
+                .eq("uniform_code", "AI022")
+        );
+        //遍历testingPointList1,把code取出放入一个string集合
+        List<String> codeList1 = new ArrayList<>();
+        for (TestingPoint testingPoint : testingPointList1) {
+            String code = testingPoint.getCode();
+            codeList1.add(code);
+        }
+        //遍历codeList作为适配器的参数,获取到1分钟实际平均功率
+        for (String code : codeList1) {
+            List<PointDatas> pointDataList = adapter.getHistoryStat(code, startDateTime.getTime(), endDateTime.getTime(), 60);
+
         }
-        System.out.println("麻黄山理论发电量:"+mhsllfdl.divide(BigDecimal.valueOf(10000),4,RoundingMode.HALF_EVEN));
-        System.out.println("牛首山理论发电量:"+nssllfdl.divide(BigDecimal.valueOf(10000),4,RoundingMode.HALF_EVEN));
-        System.out.println("青山理论发电量:"+qsllfdl.divide(BigDecimal.valueOf(10000),4,RoundingMode.HALF_EVEN));
-        System.out.println("石板泉理论发电量:"+sbqllfdl.divide(BigDecimal.valueOf(10000),4,RoundingMode.HALF_EVEN));
-        System.out.println("香山理论发电量:"+xsllfdl.divide(BigDecimal.valueOf(10000),4,RoundingMode.HALF_EVEN));
+
+        //根据uniform_code=AI022从testing_point表中获取到风机的风速测点
+        List<TestingPoint> testingPointList = testingPointService.list(new QueryWrapper<TestingPoint>()
+                .eq("uniform_code", "AI022")
+        );
+        //遍历testingPointList,把code取出放入一个string集合
+        List<String> codeList = new ArrayList<>();
+        for (TestingPoint testingPoint : testingPointList) {
+            String code = testingPoint.getCode();
+            codeList.add(code);
+        }
+
+        //新建一个map,键为风机编码,值为map集合,值的map集合的键为时间,值为1分钟理论发电量
+        Map<String, Map<Long, BigDecimal>> map1 = new HashMap<>();
+
+        //遍历codeList作为适配器的参数,获取到1分钟平均风速
+        for (String code : codeList) {
+            List<PointDatas> pointDataList = adapter.getHistoryStat(code, startDateTime.getTime(), endDateTime.getTime(), 60);
+
+            //遍历testingPointList,根据code取到风机编码thing_id
+            for (TestingPoint testingPoint : testingPointList) {
+                String code1 = testingPoint.getCode();
+                if (code.equals(code1)) {
+                    String thingId = testingPoint.getThingId();
+                    //根据thingId从equipmentList中取出型号
+                    for (Equipment equipment : equipmentList) {
+                        String nemCode = equipment.getNemCode();
+                        if (thingId.equals(nemCode)) {
+                            String modelId = equipment.getModelId();
+                            //根据modelId从map中取出map集合,键为speed,值为theory_power
+                            Map<BigDecimal, Double> map2 = map.get(modelId);
+                            //遍历pointDataList,拿到风速,根据风速从map2中取到理论功率,计算1分钟理论发电量
+                            for (PointDatas pointData : pointDataList) {
+                                //风速
+                                double speed0 = pointData.getAvg().getValue();
+                                BigDecimal speed = new BigDecimal(speed0).setScale(2, RoundingMode.HALF_EVEN);
+
+                                Double theoryPower = 0.0;
+                                if (speed0 >= 3 && speed0 <= 25) {
+                                    //理论功率
+                                    theoryPower = map2.get(speed);
+                                }
+
+
+
+
+
+
+                                //时间
+                                DateTime dateTime = DateTime.of(pointData.getAvg().getTs());
+
+
+                                BigDecimal llfdl = BigDecimal.valueOf(0);
+                                //1分钟理论发电量
+                                if (theoryPower != null) {
+                                    llfdl = new BigDecimal(Double.toString(theoryPower))
+                                            .multiply(new BigDecimal(Double.toString(1)))
+                                            .divide(new BigDecimal(Double.toString(60)), 2, RoundingMode.HALF_UP);
+                                }
+
+
+                                //存入map1,键为风机编码,值为map集合,值的map集合的键为时间,值为1分钟理论发电量
+                                if (map1.containsKey(nemCode)) {
+                                    // 如果已存在,获取对应的内层HashMap,并添加新的映射关系
+                                    Map<Long, BigDecimal> innerMap = map1.get(nemCode);
+                                    innerMap.put(dateTime.getTime(), llfdl);
+                                } else {
+                                    // 如果不存在,创建新的内层HashMap,并添加映射关系
+                                    Map<Long, BigDecimal> innerMap = new HashMap<>();
+                                    innerMap.put(dateTime.getTime(), llfdl);
+                                    map1.put(nemCode, innerMap);
+                                }
+
+                            }
+
+
+                        }
+                    }
+                }
+
+
+            }
+        }
+
+        HashMap<String, BigDecimal> map2 = new HashMap<>();
+        for (String key : map1.keySet()) {
+            Map<Long, BigDecimal> mapValues = map1.get(key);
+            BigDecimal llfdl = BigDecimal.valueOf(0);
+            for (BigDecimal mapValue : mapValues.values()) {
+                llfdl = llfdl.add(mapValue);
+            }
+            map2.put(key, llfdl);
+        }
+
+        BigDecimal mhsllfdl = BigDecimal.valueOf(0);
+        BigDecimal nssllfdl = BigDecimal.valueOf(0);
+        BigDecimal qsllfdl = BigDecimal.valueOf(0);
+        BigDecimal sbqllfdl = BigDecimal.valueOf(0);
+        BigDecimal xsllfdl = BigDecimal.valueOf(0);
+
+        for (String key : map2.keySet()) {
+            if (key.contains("NX_GDDL_MHS_F_WT_")) {
+                mhsllfdl = mhsllfdl.add(map2.get(key));
+            }
+            if (key.contains("NX_GDDL_NSS_F_WT_")) {
+                nssllfdl = nssllfdl.add(map2.get(key));
+            }
+            if (key.contains("NX_GDDL_QS_F_WT_")) {
+                qsllfdl = qsllfdl.add(map2.get(key));
+            }
+            if (key.contains("NX_GDDL_SBQ_F_WT_")) {
+                sbqllfdl = sbqllfdl.add(map2.get(key));
+            }
+            if (key.contains("NX_GDDL_XS_F_WT_")) {
+                xsllfdl = xsllfdl.add(map2.get(key));
+            }
+
+
+        }
+        System.out.println("麻黄山理论发电量:" + mhsllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+        System.out.println("牛首山理论发电量:" + nssllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+        System.out.println("青山理论发电量:" + qsllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+        System.out.println("石板泉理论发电量:" + sbqllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+        System.out.println("香山理论发电量:" + xsllfdl.divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_EVEN));
+
+
+
 
     }