Переглянути джерело

修改风切变计算方式

hxf 1 рік тому
батько
коміт
d33d4ed218

+ 3 - 3
wrdep-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);

+ 245 - 8
wrdep-biz/src/main/java/com/jiayue/biz/service/impl/DataAnalysisServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jiayue.biz.service.impl;
 
+import cn.hutool.db.Entity;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.biz.domain.*;
 import com.jiayue.biz.eunms.WindDirectionEnum;
@@ -33,12 +34,8 @@ public class DataAnalysisServiceImpl extends ServiceImpl<WindTowerDataParentTabl
     private final WindTowerCalculationDataServiceImpl windTowerCalculationDataService;
     private final EquipmentAttributeService equipmentAttributeService;
 
-
-    private final RealTimeDisplayService realTimeDisplayService;
-
+    private final ProphaseWeatherDataService prophaseWeatherDataService;
     private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataService;
-    private final WindTowerDataParentTableService windTowerDataParentTableService;
-
 
 
     @Override
@@ -48,13 +45,253 @@ public class DataAnalysisServiceImpl extends ServiceImpl<WindTowerDataParentTabl
             //将结束时间设置为昨天结束时间
             endDay = DateUtil.endOfDay(DateUtil.yesterday());
         }
-        Map<String, Object> map = new HashMap<>();
-        SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        long realityCount = 0;//数据实际条数
         // 一年的计算数据
         startDay = DateUtil.beginOfMonth(startDay);
         endDay = DateUtil.endOfMonth(endDay);
+        Map<String, Object> map = new HashMap<>();
+        long realityCount = 0;//数据实际条数
+
+        List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startDay, endDay, equipmentId);
+        // 一年的风向统计数据
+        List<WindDirectionStatisticsData> windDirectionStatisticsDataList = windDirectionStatisticsDataService.getByBetweenTimeAndEquipmentId(startDay, endDay, equipmentId);
+        //所有类型数据
+        List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
+        //测风塔信息
+        List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, equipmentId).list();
+        //计算完整性
+        List<Entity> entities = prophaseWeatherDataService.selectCount(equipmentId);
+
+        for (Entity entity : entities) {
+            // td engine 取出的时间需要截取字段
+            realityCount += (long) entity.get("count(*)");
+        }
+        //测风塔基本信息
+        Map<String, Object> windTowerInfo = this.getWindTowerInfo(windTowerInfos.get(0), startDay, endDay);
+        map.put("windTowerInfo", windTowerInfo);
+        //数据完整性
+        Map<String, Object> statusData = this.getStatusData(windTowerInfos.get(0), startDay, endDay, realityCount);
+        map.put("dataIntegrity", statusData);
+        //风速和风速密度各月日变化表格
+        Map<String, Object> monthWpdTable = getMonthWpdTable(windTowerCalculationDatas, equipmentAttributeList, windTowerInfos, startDay, endDay);
+        map.put("monthWpdTable", monthWpdTable);
+        //pdf威布尔
+        Map<String, Object> weibull = pdfWeibull(equipmentAttributeList, equipmentId, windTowerCalculationDatas, height);
+        map.put("weibull", weibull);
+
+
+        return map;
+    }
+
+    public Map<String, Object> getStatusData(WindTowerInfo windTowerInfo, Date startDay, Date endDay, long realityCount) {
+        HashMap<String, Object> dataIntegrity = new HashMap<>();
+        dataIntegrity.put("time", DateUtil.format(windTowerInfo.getInstallationTime(), "yyyy年MM月dd日"));
+        dataIntegrity.put("startTime", DateUtil.format(startDay, "yyyy-MM-dd"));
+        long count = (endDay.getTime() + 1000 - startDay.getTime()) / (86400000);
+        long totalCount = count * 144;//时间范围内的总条数
+        BigDecimal divide = BigDecimal.valueOf(realityCount).divide(BigDecimal.valueOf(totalCount), 2, RoundingMode.HALF_UP);
+
+        dataIntegrity.put("integrityRate", divide);
+        dataIntegrity.put("totalNum", realityCount);
+        return dataIntegrity;
+
+    }
+
+
+    /**
+     * @param windTowerInfo 测风塔数据
+     * @param startDay      开始时间
+     * @param endDay        结束时间
+     * @return 基本信息
+     */
+    public Map<String, Object> getWindTowerInfo(WindTowerInfo windTowerInfo, Date startDay, Date endDay) {
+
+        HashMap<String, Object> hashMap = new HashMap<>();
+        hashMap.put("name", windTowerInfo.getName());
+        hashMap.put("equipmentNo", windTowerInfo.getEquipmentNo());
+        hashMap.put("installationTime", windTowerInfo.getInstallationTime());
+        hashMap.put("startTime", DateUtil.format(startDay, "yyyy-MM-dd"));
+        hashMap.put("endTime", DateUtil.format(endDay, "yyyy-MM-dd"));
+        hashMap.put("longitude", windTowerInfo.getLongitude());
+        hashMap.put("latitude", windTowerInfo.getLatitude());
+        hashMap.put("wsHeight", windTowerInfo.getHeights());
+        hashMap.put("wdHeight", windTowerInfo.getWdHeights());
+
+        return hashMap;
+
+
+    }
 
+
+    /**
+     * 风速和风速密度各月日变化表格
+     *
+     * @return map
+     */
+    public Map<String, Object> getMonthWpdTable(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfos, Date startDay, Date endDay) {
+        Map<String, Object> map = new HashMap<>();
+        List<List<BigDecimal>> list = new ArrayList<>();
+        List<String> timeList = new ArrayList<>();
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+            List<Long> timeByMonth = DateTimeUtil.getIntervalTimeByMonth(startDay, endDay);
+            for (Long aLong : timeByMonth) {
+                Date monthStartTime = DateTimeUtil.getDayStartTime(aLong);
+                timeList.add(sdf.format(monthStartTime));
+            }
+            timeList.add("平均");
+            //获取风速层高
+            String height;
+            height = windTowerInfos.get(0).getHeights();
+            if (height == null || height.equals("")) {
+                height = "10,30,50,60,70,80,90,100,110,120,140,150";
+            }
+            String[] heightAll = height.split(",");
+            List<String> tableHeader = new ArrayList<>();
+            tableHeader.add("月份");
+            for (String str : heightAll) {
+                List<BigDecimal> wsDataList = new ArrayList<>();
+                List<BigDecimal> wpdDataList = new ArrayList<>();
+                tableHeader.add(str + "m风速(m/s)");
+                tableHeader.add(str + "m风功率密度(w/㎡)");
+                String wpdFieldName = str + "wpdMonth"; //wpdMonth  awsDay
+                String awsFieldName = str + "awsMonth";
+                List<EquipmentAttribute> wpdFieldNameList = equipmentAttributeList.stream().filter(e -> wpdFieldName.equals(e.getFieldName())).collect(Collectors.toList());
+                List<EquipmentAttribute> awsFieldNameList = equipmentAttributeList.stream().filter(e -> awsFieldName.equals(e.getFieldName())).collect(Collectors.toList());
+                BigDecimal sumAveWs = new BigDecimal(0);
+                BigDecimal sumAveWpd = new BigDecimal(0);
+                if (!wpdFieldNameList.isEmpty() && !awsFieldNameList.isEmpty()) {
+                    String wpdEbId = wpdFieldNameList.get(0).getId();
+                    String awsEbId = awsFieldNameList.get(0).getId();
+                    //平均风速集合
+                    List<WindTowerCalculationData> awsAllList;
+                    //风功率密度集合
+                    List<WindTowerCalculationData> wpdAllList;
+                    awsAllList = windTowerCalculationDataList.stream().filter(w -> awsEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
+                    wpdAllList = windTowerCalculationDataList.stream().filter(w -> wpdEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
+
+
+                    for (Long aLong : timeByMonth) {
+                        BigDecimal avgWs = new BigDecimal(0);
+                        BigDecimal avgWpd = new BigDecimal(0);
+
+                        //过滤平均风速集合
+                        List<WindTowerCalculationData> awsList;
+                        //过滤风功率密度集合
+                        List<WindTowerCalculationData> wpdList;
+                        awsList = awsAllList.stream().filter(w -> w.getTime().equals(new Date(aLong))).collect(Collectors.toList());
+                        wpdList = wpdAllList.stream().filter(w -> w.getTime().equals(new Date(aLong))).collect(Collectors.toList());
+                        if (!awsList.isEmpty()) {
+                            List<BigDecimal> valueList = awsList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
+                            avgWs = valueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(valueList.size()), 2, RoundingMode.HALF_UP);
+                        }
+                        wsDataList.add(avgWs);
+                        if (!wpdList.isEmpty()) {
+                            List<BigDecimal> valueList = wpdList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
+                            avgWpd = valueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(valueList.size()), 2, RoundingMode.HALF_UP);
+                        }
+                        wpdDataList.add(avgWpd);
+
+
+                    }
+
+                    int wsListCount = wsDataList.stream().filter(w -> w.compareTo(new BigDecimal(0)) != 0).collect(Collectors.toList()).size();
+                    int wpdListCount = wpdDataList.stream().filter(w -> w.compareTo(new BigDecimal(0)) != 0).collect(Collectors.toList()).size();
+                    if (wsListCount != 0) {
+                        sumAveWs = wsDataList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(wsListCount), 2, RoundingMode.HALF_UP);
+                    }
+                    if (wpdListCount != 0) {
+                        sumAveWpd = wpdDataList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(wpdListCount), 2, RoundingMode.HALF_UP);
+                    }
+                    wsDataList.add(sumAveWs);
+                    wpdDataList.add(sumAveWpd);
+                }
+                list.add(wsDataList);
+                list.add(wpdDataList);
+            }
+            map.put("tableHeader", tableHeader);
+            map.put("data", list);
+            map.put("month", timeList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+
+    }
+
+
+    /**
+     * pdf威布尔
+     *
+     * @param height 层高
+     * @return weibull
+     */
+    public Map<String, Object> pdfWeibull(List<EquipmentAttribute> equipmentAttributeList, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, String height) {
+        Map<String, Object> map = new HashMap<>();
+        List<BigDecimal> wsList = new ArrayList<>();
+        try {
+            double e = 2.71828183;
+            // 风速集合
+            String ebId = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(height + "aws")).collect(Collectors.toList()).get(0).getId();
+
+            List<WindTowerCalculationData> calculationDataList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(ebId)).collect(Collectors.toList());
+            for (WindTowerCalculationData w : calculationDataList) {
+                wsList.add(w.getValue());
+            }
+
+            TreeMap<BigDecimal, List<BigDecimal>> wsMap = new TreeMap<>();
+
+            if (!wsList.isEmpty()) {
+                ArrayList<Object> arrayWsList = new ArrayList<>(wsList);
+                //把风速集合传入,计算A、K
+                ProbabilityPlot probabilityPlot = new ProbabilityPlot(arrayWsList);
+                probabilityPlot.suppressDisplay();
+                double K = probabilityPlot.weibullTwoParGamma();
+                double A = probabilityPlot.weibullTwoParSigma();
+
+
+                map.put("K", BigDecimal.valueOf(K).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                map.put("A", BigDecimal.valueOf(A).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                BigDecimal wsAve = wsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(wsList.size()), 2, RoundingMode.HALF_UP);
+                map.put("wsAve", wsAve);
+
+                /*根据风速过滤出风速区间集合*/
+                for (BigDecimal ws : wsList) {
+                    // 风速区间
+                    BigDecimal speedLevel = BigDecimal.valueOf(Math.ceil(ws.subtract(BigDecimal.valueOf(0.5)).doubleValue()));
+                    if (wsMap.containsKey(speedLevel)) {
+                        wsMap.get(speedLevel).add(ws);
+                    } else {
+                        wsMap.put(speedLevel, new ArrayList<>());
+                        wsMap.get(speedLevel.setScale(1, RoundingMode.HALF_UP)).add(ws);
+                    }
+                }
+
+                /*风速频率*/
+                List<List<BigDecimal>> wsFreList = new ArrayList<>();
+                /*威布尔*/
+                List<List<BigDecimal>> weibullList = new ArrayList<>();
+                wsMap.forEach((key, val) -> {
+
+                    List<BigDecimal> list = new ArrayList<>();
+                    List<BigDecimal> tempList = new ArrayList<>();
+                    BigDecimal wsFrequency = new BigDecimal(val.size()).divide(new BigDecimal(wsList.size()), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
+                    list.add(key.setScale(0, RoundingMode.HALF_UP));
+                    list.add(wsFrequency);
+                    wsFreList.add(list);
+
+                    /*区间威布尔累加求和求平均值*/
+                    BigDecimal aveWs = val.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(val.size()), 2, RoundingMode.HALF_UP);
+                    BigDecimal weibull = CalculationUtil.getBigDecimal(e, aveWs.doubleValue(), K, A);
+                    tempList.add(key.setScale(0, RoundingMode.HALF_UP));
+                    tempList.add(weibull);
+                    weibullList.add(tempList);
+                });
+                map.put("wsFrequency", wsFreList);
+                map.put("weibull", weibullList);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         return map;
     }
 

+ 2 - 2
wrdep-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);

+ 26 - 44
wrdep-biz/src/main/java/com/jiayue/biz/service/impl/WindTowerCalculationDataServiceImpl.java

@@ -193,15 +193,18 @@ public class WindTowerCalculationDataServiceImpl extends ServiceImpl<WindTowerCa
                     .map(p -> CalculationUtil.getBattery(BigDecimal.valueOf(p.getWsAve()))).reduce(BigDecimal.ZERO, BigDecimal::add);
 
             //日发电量
-            batterySum = batterySum.divide(BigDecimal.valueOf(6 * 1000), 2, RoundingMode.HALF_UP);
+            if(batterySum.compareTo(BigDecimal.ZERO) != 0){
+                batterySum = batterySum.divide(BigDecimal.valueOf(6 * 1000), 2, RoundingMode.HALF_UP);
+
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setValue(batterySum);
+                windTowerCalculationData.setEbId(batteryDay.get(0).getId());
+                windTowerCalculationData.setTime(DateUtil.beginOfDay(new Date(time)));
+                windTowerCalculationData.setEquipmentId(windTowerInfo.getEquipmentNo());
+                batteryList.add(windTowerCalculationData);
+                windTowerCalculationDataList.add(windTowerCalculationData);
+            }
 
-            WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
-            windTowerCalculationData.setValue(batterySum);
-            windTowerCalculationData.setEbId(batteryDay.get(0).getId());
-            windTowerCalculationData.setTime(DateUtil.beginOfDay(new Date(time)));
-            windTowerCalculationData.setEquipmentId(windTowerInfo.getEquipmentNo());
-            batteryList.add(windTowerCalculationData);
-            windTowerCalculationDataList.add(windTowerCalculationData);
 
         }
         return batteryList;
@@ -1707,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());
             //删除统计时间段所有数据
@@ -1729,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);
@@ -1767,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);
@@ -1970,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
wrdep-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;
     }
 

+ 1 - 1
wrdep-biz/src/main/resources/application-dev.yml

@@ -19,7 +19,7 @@ spring:
       primary: mysql #设置默认的数据源或者数据源组,默认值即为master
       datasource:
         mysql:
-          url: jdbc:mysql://192.168.1.205:3306/nerp-test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          url: jdbc:mysql://192.168.1.205:3306/wrdep?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
 #          url: jdbc:mysql://49.4.78.194:17136/nerp-test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
 #          url: jdbc:mysql://10.124.252.246:3306/nerp-db-v2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
           username: root

+ 1 - 1
wrdep-biz/src/main/resources/application.yml

@@ -18,7 +18,7 @@ elf:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 9090
+  port: 9091
   servlet:
     # 应用的访问路径
     context-path: /