瀏覽代碼

修改风切变计算方式

hxf 1 年之前
父節點
當前提交
a154be88fe

+ 3 - 3
neim-biz/src/main/java/com/jiayue/biz/job/AirDensityJob.java

@@ -125,7 +125,7 @@ public class AirDensityJob {
             ArrayList<WindTowerCalculationData> turList = windTowerCalculationDataService.turbulenceDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
             dataList.addAll(turList);
             //日平均风切变
-            ArrayList<WindTowerCalculationData> windShearDay = windTowerCalculationDataService.shearDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
+            ArrayList<WindTowerCalculationData> windShearDay = windTowerCalculationDataService.shearDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList);
             dataList.addAll(windShearDay);
             //日平均风功率密度
             ArrayList<WindTowerCalculationData> wpdDayList = windTowerCalculationDataService.wpdDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
@@ -152,7 +152,7 @@ public class AirDensityJob {
                     ArrayList<WindTowerCalculationData> wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
                     dataList.addAll(wsMaxMonth);
                     //月平均风切变
-                    ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
+                    ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList);
                     dataList.addAll(shearMonth);
                     //月平均风速标差
                     ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
@@ -193,7 +193,7 @@ public class AirDensityJob {
                 ArrayList<WindTowerCalculationData> wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
                 dataList.addAll(wsMaxMonth);
                 //月平均风切变
-                ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
+                ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList);
                 dataList.addAll(shearMonth);
                 //月平均风速标差
                 ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);

+ 2 - 2
neim-biz/src/main/java/com/jiayue/biz/service/impl/DataRecalculationImpl.java

@@ -648,7 +648,7 @@ public class DataRecalculationImpl implements DataRecalculationService {
             ArrayList<WindTowerCalculationData> wpdDay = windTowerCalculationDataService.wpdDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
             allDataList.addAll(wpdDay);
             //日平均风切变
-            ArrayList<WindTowerCalculationData> shearDay = windTowerCalculationDataService.shearDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
+            ArrayList<WindTowerCalculationData> shearDay = windTowerCalculationDataService.shearDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList);
             allDataList.addAll(shearDay);
 
 
@@ -670,7 +670,7 @@ public class DataRecalculationImpl implements DataRecalculationService {
                 ArrayList<WindTowerCalculationData> wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
                 allDataList.addAll(wsMaxMonth);
                 //月平均风切变
-                ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
+                ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList);
                 allDataList.addAll(shearMonth);
                 //月平均风速标差
                 ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);

+ 15 - 36
neim-biz/src/main/java/com/jiayue/biz/service/impl/WindTowerCalculationDataServiceImpl.java

@@ -1710,18 +1710,14 @@ public class WindTowerCalculationDataServiceImpl extends ServiceImpl<WindTowerCa
      * @param equipmentId 设备id
      * @return
      */
-    public ArrayList<WindTowerCalculationData> shearDay(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
+    public ArrayList<WindTowerCalculationData> shearDay(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList,List<ProphaseAnemometryData> prophaseAnemometryDataList) {
         long startHour = startTime.getTime();
         long endHour = endTime.getTime();
         long dayTime = 86400000L;
-        //日平均所需要的集合
-        List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startTime) && w.getTime().before(endTime)).collect(Collectors.toList());
+        String[] heights = windTowerInfoList.get(0).getHeights().split(",");
+
         ArrayList<WindTowerCalculationData> list = new ArrayList<>();
         try {
-            //遍历层高
-
-            //获取所有小时综合风切变
-            List<EquipmentAttribute> shearList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(windShearFiledName)).collect(Collectors.toList());
             //获取日综合风切变
             List<EquipmentAttribute> shearDayList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(windShearDayFiledName)).collect(Collectors.toList());
             //删除统计时间段所有数据
@@ -1732,17 +1728,12 @@ public class WindTowerCalculationDataServiceImpl extends ServiceImpl<WindTowerCa
 
                 //获取所有小时风切变数据
                 long start = start1;
-                List<WindTowerCalculationData> shearCalDataList = windTowerCalculationDataList1.stream().filter(w -> w.getTime().after(new Date(start)) &&
-                        w.getTime().before(new Date(start2)) && w.getEquipmentId().equals(equipmentId) && w.getEbId().equals(shearList.get(0).getId())).collect(Collectors.toList());
-                //小时风切变总值
-                BigDecimal shearSum = BigDecimal.ZERO;
-                for (WindTowerCalculationData shear : shearCalDataList) {
-                    shearSum = shearSum.add(shear.getValue());
-                }
-                if (!shearCalDataList.isEmpty()) {
+                List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= start && p.getTs().getTime() < start2).collect(Collectors.toList());
+                BigDecimal windShear = CalculationUtil.getWindShear(collect, heights);
+                if (collect.size() > 0) {
                     WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
                     windTowerCalculationData.setEquipmentId(equipmentId);
-                    windTowerCalculationData.setValue(shearSum.divide(new BigDecimal(shearCalDataList.size()), 2, RoundingMode.HALF_UP));
+                    windTowerCalculationData.setValue(windShear);
                     windTowerCalculationData.setEbId(shearDayList.get(0).getId());
                     windTowerCalculationData.setTime(new Date(start1));
                     windTowerCalculationDataList.add(windTowerCalculationData);
@@ -1770,33 +1761,27 @@ public class WindTowerCalculationDataServiceImpl extends ServiceImpl<WindTowerCa
      * @param equipmentId 设备id
      * @return
      */
-    public ArrayList<WindTowerCalculationData> shearMonth(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
+    public ArrayList<WindTowerCalculationData> shearMonth(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList,List<ProphaseAnemometryData> prophaseAnemometryDataList) {
         //时间-1防止0点数据查不到
         Date startHour = new Date(startTime.getTime() - 1);
         //获取时间段所有统计数据
-        List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour) && w.getTime().before(endTime)).collect(Collectors.toList());
         ArrayList<WindTowerCalculationData> list = new ArrayList<>();
         try {
             //获取月平均综合风切变字段
             String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("windShearMonth")).collect(Collectors.toList()).get(0).getId();
-            String ebIdDay = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("windShearDay")).collect(Collectors.toList()).get(0).getId();
             //删除时间段所有数据
             removeByStartTimeBetweenAndEquipmentIdAndEbId(startHour, endTime, equipmentId, ebIdMonth);
-            //获取所有日平均风切变
-            List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(ebIdDay) && w.getTime().after(startHour) && w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId))
-                    .collect(Collectors.toList());
-            BigDecimal sum = new BigDecimal(0);
 
-            for (WindTowerCalculationData w : windTowerCalculationDatas) {
-                sum = sum.add(w.getValue());
-            }
+            String heights = windTowerInfoList.get(0).getHeights();
+            List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime() && p.getTs().getTime() < endTime.getTime()).collect(Collectors.toList());
+            BigDecimal windShear = CalculationUtil.getWindShear(collect, heights.split(","));
 
-            if (!windTowerCalculationDatas.isEmpty()) {
+            if (collect.size() > 0) {
                 WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
                 windTowerCalculationData.setEbId(ebIdMonth);
                 windTowerCalculationData.setTime(startTime);
                 windTowerCalculationData.setEquipmentId(equipmentId);
-                windTowerCalculationData.setValue(sum.divide(new BigDecimal(windTowerCalculationDatas.size()), 2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP));
+                windTowerCalculationData.setValue(windShear);
                 list.add(windTowerCalculationData);
             } else {
                 log.info("设备编号{},{}月平均风切变指数计算失败,缺少数据^ ^", equipmentId, startTime.getMonth() + 1);
@@ -1973,23 +1958,17 @@ public class WindTowerCalculationDataServiceImpl extends ServiceImpl<WindTowerCa
             for (long start1 = startHour; start1 <= endHour; start1 = start1 + 3600000) {
                 //开始时间--->start1  结束时间---->start2
                 long start2 = start1 + 3600000L;
-                BigDecimal oneHourWindShear = BigDecimal.ZERO;
                 BigDecimal total = BigDecimal.ZERO;
 
                 long finalStart = start1;
                 List<ProphaseAnemometryData> collect = prophaseAnemometryData.stream().filter(p -> p.getTs().getTime() >= finalStart && p.getTs().getTime() < start2).collect(Collectors.toList());
                 //计算综合风切变
                 BigDecimal windShear = CalculationUtil.getWindShear(collect, heights);
-                if (windShear.compareTo(BigDecimal.ZERO) != 0) {
-                    oneHourWindShear = oneHourWindShear.add(windShear);
-                    total = total.add(BigDecimal.ONE);
-                }
-
-                if (total.compareTo(BigDecimal.ZERO) > 0) {
+                if (collect.size() > 0) {
                     WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
                     windTowerCalculationData.setEquipmentId(equipmentId);
                     windTowerCalculationData.setTime(new Date(start1));
-                    windTowerCalculationData.setValue(oneHourWindShear.divide(total, 2, RoundingMode.HALF_UP));
+                    windTowerCalculationData.setValue(windShear);
                     windTowerCalculationData.setEbId(equipmentAttribute.getId());
                     windTowerCalculationDataList.add(windTowerCalculationData);
                     listAll.add(windTowerCalculationData);

+ 32 - 23
neim-biz/src/main/java/com/jiayue/biz/util/CalculationUtil.java

@@ -356,32 +356,41 @@ public class CalculationUtil {
     public static BigDecimal getWindShear(List<ProphaseAnemometryData> prophaseAnemometryData, String[] heights) {
         BigDecimal sumWShear = BigDecimal.ZERO;
         BigDecimal total = BigDecimal.ZERO;
-        if (prophaseAnemometryData.size() > 0) {
-            //循环风速数据集合
-            for (ProphaseAnemometryData prophaseAnemometryDatum : prophaseAnemometryData) {
-                //筛选同一时间的数据集合
-                List<ProphaseAnemometryData> collect = prophaseAnemometryData.stream().filter(p -> p.getTs().getTime() == prophaseAnemometryDatum.getTs().getTime()).collect(Collectors.toList());
-                String maxHeight = heights[0];
-                List<ProphaseAnemometryData> heightCollect = collect.stream().filter(p -> p.getLayerHeight().equals(maxHeight)).collect(Collectors.toList());
-                BigDecimal wsAveForMax = BigDecimal.valueOf(heightCollect.get(0).getWsAve());
-                //循环层高 计算每个低于最高层高的 风切变数据
-                for (String minHeight : heights) {
-                    if (!getNumberFromString(minHeight).equals(getNumberFromString(maxHeight))) {
-                        List<ProphaseAnemometryData> sCollect = collect.stream().filter(p -> p.getLayerHeight().equals(minHeight)).collect(Collectors.toList());
-                        BigDecimal wsAveMin = BigDecimal.valueOf(sCollect.get(0).getWsAve());
-                        double z = new BigDecimal(getNumberFromString(maxHeight)).divide(new BigDecimal(getNumberFromString(minHeight)), 4, RoundingMode.HALF_UP).doubleValue();
-                        double z1 = Math.log10(z);
-                        BigDecimal shear = Convert.toBigDecimal(Math.log10(Convert.toDouble(wsAveForMax.divide(wsAveMin, 8, RoundingMode.HALF_UP))))
-                                .divide(BigDecimal.valueOf(z1), 8, RoundingMode.HALF_UP);
-                        sumWShear = sumWShear.add(shear);
-                        total = total.add(BigDecimal.ONE);
-                    }
-                }
+
+        for (String maxHeight : heights) {
+            if(maxHeight.contains( "A")){
+                continue;
             }
-            if (total.compareTo(BigDecimal.ZERO) > 0) {
-                sumWShear = sumWShear.divide(total, 2, RoundingMode.HALF_UP);
+            List<BigDecimal> maxHeightForWsList = prophaseAnemometryData.stream().filter(p -> p.getLayerHeight().equals(maxHeight)).map(p -> {
+                return getBigDecimal(p.getWsAve());
+            }).collect(Collectors.toList());
+            BigDecimal wsAveForMax = getAvgWind(maxHeightForWsList);
+            //筛选低层高
+            List<String> heightList = new ArrayList<>(Arrays.asList(heights)).stream().filter(s -> Integer.valueOf(CalculationUtil.getNumberFromString(maxHeight)) > Integer.valueOf(CalculationUtil.getNumberFromString(s))).collect(Collectors.toList());
+            //计算风切变
+            for (String minHeight : heightList) {
+                if(minHeight.contains( "A")){
+                    continue;
+                }
+                List<BigDecimal> minHeightForWsList = prophaseAnemometryData.stream().filter(p -> p.getLayerHeight().equals(minHeight)).map(p -> {
+                    return getBigDecimal(p.getWsAve());
+                }).collect(Collectors.toList());
+                BigDecimal wsAveMin = getAvgWind(minHeightForWsList);
+                double z = new BigDecimal(getNumberFromString(maxHeight)).divide(new BigDecimal(getNumberFromString(minHeight)),8,RoundingMode.HALF_UP).doubleValue();
+                double z1 = Math.log10(z);
+                if(wsAveMin.compareTo(BigDecimal.ZERO) > 0){
+                    BigDecimal shear = Convert.toBigDecimal(Math.log10(Convert.toDouble(wsAveForMax.divide(wsAveMin,8,RoundingMode.HALF_UP))))
+                            .divide(BigDecimal.valueOf(z1), 8, RoundingMode.HALF_UP);
+                    sumWShear = sumWShear.add(shear);
+                    total = total.add(BigDecimal.ONE);
+//                    System.out.println(" height = " + maxHeight + "====" + wsAveForMax + "====" + minHeight + "====" + wsAveMin + "======" + shear);
+                }
             }
         }
+
+        if (total.compareTo(BigDecimal.ZERO) > 0) {
+            sumWShear = sumWShear.divide(total, 2, RoundingMode.HALF_UP);
+        }
         return sumWShear;
     }