Browse Source

1.计算方法调整优化
2.毛武平 在2024年5月7日提出修改需求,项目2 相关的声雷达数据,首页数据显示130米层高以内的数据;等效小时数使用100米层高数据计算

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

+ 1 - 1
wrdep-biz/src/main/java/com/jiayue/biz/controller/HomePageController.java

@@ -3,6 +3,7 @@ package com.jiayue.biz.controller;
 import com.jiayue.biz.service.*;
 import com.jiayue.common.core.controller.BaseController;
 import com.jiayue.common.core.domain.AjaxResult;
+import com.jiayue.common.core.text.Convert;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
@@ -42,7 +43,6 @@ public class HomePageController extends BaseController {
      */
     @GetMapping("/roseChats")
     public AjaxResult homePageRose(String equipmentId, String height, String month) {
-
         return AjaxResult.success(homePageService.homePageRose(equipmentId, height, month));
     }
 

+ 6 - 1
wrdep-biz/src/main/java/com/jiayue/biz/domain/WindTowerCalculationData.java

@@ -26,7 +26,12 @@ public class WindTowerCalculationData implements Serializable {
 
 	private static final long serialVersionUID = 1L;
 
-
+    public WindTowerCalculationData(Date startTime, String equipmentId, String ebId, BigDecimal value) {
+        this.time = startTime;
+        this.equipmentId = equipmentId;
+        this.ebId = ebId;
+        this.value = value;
+    }
     /** 主键ID */
     @TableId(type = IdType.ASSIGN_UUID)
     private String id;

+ 52 - 145
wrdep-biz/src/main/java/com/jiayue/biz/job/AirDensityJob.java

@@ -36,7 +36,6 @@ public class AirDensityJob {
 
     private final WindTowerInfoServiceImpl windTowerInfoService;
 
-    private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataService;
 
     private final EquipmentAttributeService equipmentAttributeService;
 
@@ -53,7 +52,7 @@ public class AirDensityJob {
     private final MongoTemplate mongoTemplate;
 
     private final com.jiayue.biz.api.apiHDY apiHDY;
-
+    private final WindDataCalculation2Service windDataCalculationService;
 
     @Scheduled(cron = "0 30 9 * * ?")
     public void AirDensityCalculation() {
@@ -74,154 +73,62 @@ public class AirDensityJob {
         //传入时间的月末
         Date endMonthDate = DateTimeUtil.endOfMonth(endDate);
         for (WindTowerInfo windTowerInfo : windTowerInfoList) {
-            WindTowerCalculationData lastData = windTowerCalculationDataService.getLastDataCalculation(windTowerInfo.getEquipmentNo());
-            List<Entity> lastRealData = prophaseWeatherDataService.getLastData(windTowerInfo.getEquipmentNo());
-            if (lastData != null && lastRealData != null) {
-                Timestamp timestamp = (Timestamp) lastRealData.get(0).get("last (ts)");
-                //获取统计数据最后数据的时间
-                long lastTime = DateUtil.endOfDay(lastData.getTime()).getTime();
-                //获取邮件数据最后数据的时间
-                long realTime = DateUtil.endOfDay(new Date(timestamp.getTime())).getTime();
-                //如果两个时间相等则不需要计算
-                if (lastTime == realTime) {
-                    continue;
-                }
-                //如果邮件的数据比统计数据的时候大8天 则取统计数据的时间作为开始时间
-                if (realTime - lastTime >= 60 * 60 * 24 * 1000 * 8) {
-                    startDate = new Date(lastTime);
+            try {
+                String equipmentNo = windTowerInfo.getEquipmentNo();
+                WindTowerCalculationData lastData = windTowerCalculationDataService.getLastDataCalculation(equipmentNo);
+                List<Entity> lastRealData = prophaseWeatherDataService.getLastData(equipmentNo);
+                if (lastData != null && lastRealData != null) {
+                    Timestamp timestamp = (Timestamp) lastRealData.get(0).get("last (ts)");
+                    //获取统计数据最后数据的时间
+                    long lastTime = DateUtil.endOfDay(lastData.getTime()).getTime();
+                    //获取邮件数据最后数据的时间
+                    long realTime = DateUtil.endOfDay(new Date(timestamp.getTime())).getTime();
+                    //如果两个时间相等则不需要计算
+                    if (lastTime == realTime) {
+                        continue;
+                    }
+                    //如果邮件的数据比统计数据的时候大8天 则取统计数据的时间作为开始时间
+                    if (realTime - lastTime >= 60 * 60 * 24 * 1000 * 8) {
+                        startDate = new Date(lastTime);
+                    }
+
+                } else {
+                    List<Entity> firstRealData = prophaseWeatherDataService.getFirstData(equipmentNo);
+                    if (firstRealData.size() > 0) {
+                        startDate = (Timestamp) firstRealData.get(0).get("first (ts)");
+                    }
                 }
+                //传入时间的月初
+                Date startMonthDate = DateTimeUtil.beginOfMonth(startDate);
 
-            } else {
-                List<Entity> firstRealData = prophaseWeatherDataService.getFirstData(windTowerInfo.getEquipmentNo());
-                if (firstRealData.size() > 0) {
-                    startDate = (Timestamp) firstRealData.get(0).get("first (ts)");
+                //风数据查询
+                List<ProphaseAnemometryData> prophaseAnemometryDataList = prophaseAnemometryDataService.selectAll(equipmentNo, new Timestamp(startMonthDate.getTime()), new Timestamp(endMonthDate.getTime()));
+                if (null == prophaseAnemometryDataList || prophaseAnemometryDataList.isEmpty()) {
+                    log.warn("计算设备:{} 无测风塔数据", equipmentNo);
+                    continue;
                 }
-
-            }
-            //传入时间的月初
-            Date startMonthDate = DateTimeUtil.beginOfMonth(startDate);
-
-            //风数据查询
-            List<ProphaseAnemometryData> prophaseAnemometryDataList = prophaseAnemometryDataService.selectAll(windTowerInfo.getEquipmentNo(), new Timestamp(startMonthDate.getTime()), new Timestamp(endMonthDate.getTime()));
-            //环境数据查询
-            List<ProphaseWeatherData> prophaseWeatherDataList = prophaseWeatherDataService.selectPublicData(windTowerInfo.getEquipmentNo(), new Timestamp(startMonthDate.getTime()), new Timestamp(endMonthDate.getTime()));
-            //统计数据
-            List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo());
-            //小时平均风速风功率密度
-            ArrayList<WindTowerCalculationData> wsAndWpdList = windTowerCalculationDataService.calculateWindPowerDensity(startDate.getTime(), endDate.getTime(), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
-            ArrayList<WindTowerCalculationData> dataList = new ArrayList<>(wsAndWpdList);
-            //每小时风切变指数
-            ArrayList<WindTowerCalculationData> windShearList = windTowerCalculationDataService.calculateWindPowerShear(startDate, endDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, windTowerCalculationDataList);
-            dataList.addAll(windShearList);
-            //日平均温度
-            ArrayList<WindTowerCalculationData> tList = windTowerCalculationDataService.tDay(startDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList);
-            dataList.addAll(tList);
-            //日平均气压
-            ArrayList<WindTowerCalculationData> paList = windTowerCalculationDataService.paDay(startDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList);
-            dataList.addAll(paList);
-            //发电量与满发小时数
-            ArrayList<WindTowerCalculationData> calculateBattery = windTowerCalculationDataService.calculateBattery(startDate.getTime(), endDate.getTime(), windTowerInfo, prophaseAnemometryDataList, equipmentAttributeList, windTowerCalculationDataList);
-            dataList.addAll(calculateBattery);
-            //日平均空气密度
-            ArrayList<WindTowerCalculationData> airList = windTowerCalculationDataService.airDensityDay(startDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
-            dataList.addAll(airList);
-            //日平均风速标差
-            ArrayList<WindTowerCalculationData> staDay = windTowerCalculationDataService.calculateStaDay(startDate, endDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
-            dataList.addAll(staDay);
-            //日平均风速
-            ArrayList<WindTowerCalculationData> wsDayList = windTowerCalculationDataService.wsDay(startDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-            dataList.addAll(wsDayList);
-            //日平均湍流
-            ArrayList<WindTowerCalculationData> turList = windTowerCalculationDataService.turbulenceDay(startDate, endDate, windTowerInfo.getEquipmentNo(), equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
-            dataList.addAll(turList);
-            //日平均风切变
-            ArrayList<WindTowerCalculationData> windShearDay = windTowerCalculationDataService.shearDay(startDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList, prophaseAnemometryDataList);
-            dataList.addAll(windShearDay);
-            //日平均风功率密度
-            ArrayList<WindTowerCalculationData> wpdDayList = windTowerCalculationDataService.wpdDay(startDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-            dataList.addAll(wpdDayList);
-            //风速在15m/s时湍流强度
-            ArrayList<WindTowerCalculationData> turForWsByFifteenDayList = windTowerCalculationDataService.turForWsByFifteenDay(startDate, endDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-            dataList.addAll(turForWsByFifteenDayList);
-
-
-            //如果结束时间和数据统计的时间相差大于30天就分割月份进行计算
-            if (endDate.getTime() - startDate.getTime() > 86400000L * 30) {
-                List<Long> dateTime = DateTimeUtil.getIntervalTimeByMonth(DateTimeUtil.beginOfMonth(startDate), DateTimeUtil.beginOfMonth(endDate));
-                for (Long l : dateTime) {
-                    //月平均风速
-                    ArrayList<WindTowerCalculationData> wsMonth = windTowerCalculationDataService.wsMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                    dataList.addAll(wsMonth);
-                    //月平均风功率密度
-                    ArrayList<WindTowerCalculationData> wpdMonth = windTowerCalculationDataService.wpdMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                    dataList.addAll(wpdMonth);
-                    //月平均湍流
-                    ArrayList<WindTowerCalculationData> turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                    dataList.addAll(turbulenceMonth);
-                    //月平均空气密度
-                    ArrayList<WindTowerCalculationData> airDensityMonth = windTowerCalculationDataService.airDensityMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList);
-                    dataList.addAll(airDensityMonth);
-                    //月最大风速
-                    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, prophaseAnemometryDataList);
-                    dataList.addAll(shearMonth);
-                    //月平均风速标差
-                    ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                    dataList.addAll(staMonth);
-                    //月玫瑰图
-                    windDirectionStatisticsDataService.roseMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList);
-                    //月平均环境数据
-                    ArrayList<WindTowerCalculationData> environmentData = windTowerCalculationDataService.environmentData(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList);
-                    dataList.addAll(environmentData);
-                    //空气密度月逐时
-                    ArrayList<WindTowerCalculationData> airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(windTowerInfo.getEquipmentNo(), DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseWeatherDataList);
-                    dataList.addAll(airDensityMonth1);
-                    //湍流月逐时
-                    ArrayList<WindTowerCalculationData> turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(windTowerInfo.getEquipmentNo(), DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                    dataList.addAll(turbulenceHourForMonth);
-
+                //环境数据查询
+                List<ProphaseWeatherData> prophaseWeatherDataList = prophaseWeatherDataService.selectPublicData(equipmentNo, new Timestamp(startMonthDate.getTime()), new Timestamp(endMonthDate.getTime()));
+                if (null == prophaseWeatherDataList || prophaseWeatherDataList.isEmpty()) {
+                    log.warn("计算设备:{} 无环境数据", equipmentNo);
+                    continue;
                 }
-            } else {
-                //空气密度月逐时
-                ArrayList<WindTowerCalculationData> airDensityMonth = windTowerCalculationDataService.airDensityMonth(windTowerInfo.getEquipmentNo(), startMonthDate, endMonthDate, prophaseWeatherDataList);
-                dataList.addAll(airDensityMonth);
-                //湍流月逐时
-                ArrayList<WindTowerCalculationData> turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(windTowerInfo.getEquipmentNo(), startMonthDate, endMonthDate, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                dataList.addAll(turbulenceHourForMonth);
-                //月平均空气密度
-                ArrayList<WindTowerCalculationData> airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList);
-                dataList.addAll(airDensityMonth1);
-                //月平均湍流
-                ArrayList<WindTowerCalculationData> turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                dataList.addAll(turbulenceMonth);
-                //月平均风速
-                ArrayList<WindTowerCalculationData> wsMonth = windTowerCalculationDataService.wsMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                dataList.addAll(wsMonth);
-                //月平均风功率密度
-                ArrayList<WindTowerCalculationData> wpdMonth = windTowerCalculationDataService.wpdMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                dataList.addAll(wpdMonth);
-                //月最大风速
-                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, prophaseAnemometryDataList);
-                dataList.addAll(shearMonth);
-                //月平均风速标差
-                ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                dataList.addAll(staMonth);
-                //月环境数据 温湿压最大最小平均
-                ArrayList<WindTowerCalculationData> environmentData = windTowerCalculationDataService.environmentData(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList);
-                dataList.addAll(environmentData);
-                // 月玫瑰图
-                windDirectionStatisticsDataService.roseMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList);
-
+                //统计数据
+                List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startMonthDate, endMonthDate, equipmentNo);
+
+                //计算结果集合
+                ArrayList<WindTowerCalculationData> dataList = new ArrayList<>();
+                Map<String, EquipmentAttribute> equipmentAttributeMap = equipmentAttributeList.stream().collect(Collectors.toMap(x -> x.getFieldName() + "", x -> x, (x1, x2) -> x1));
+                dataList = windDataCalculationService.calcu(dataList, startDate, endDate, equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeMap, windTowerCalculationDataList, windTowerInfo);
+
+                log.info("数据计算完成,开始保存:{}", dataList.size());
+                // 统计概述
+                statisticsSituationService.statisticsSituation(windTowerInfo, statisticsSituations, equipmentAttributeList);
+                //保存
+                windTowerCalculationDataService.saveBatchByEquipmentId(dataList, equipmentNo);
+            } catch (Exception e) {
+                log.error("计算设备:{} 统计数据异常:{} ", windTowerInfo.getEquipmentNo(), e);
             }
-            // 统计概述
-            statisticsSituationService.statisticsSituation(windTowerInfo, statisticsSituations, equipmentAttributeList);
-            //保存
-            windTowerCalculationDataService.saveBatchByEquipmentId(dataList, windTowerInfo.getEquipmentNo());
         }
     }
 

+ 6 - 1
wrdep-biz/src/main/java/com/jiayue/biz/job/FileAnalysisJob.java

@@ -2,6 +2,10 @@ package com.jiayue.biz.job;
 
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.text.csv.CsvData;
+import cn.hutool.core.text.csv.CsvReader;
+import cn.hutool.core.text.csv.CsvRow;
+import cn.hutool.core.text.csv.CsvUtil;
 import com.jiayue.biz.domain.ProphaseAnemometryData;
 import com.jiayue.biz.domain.ProphaseWeatherData;
 import com.jiayue.biz.domain.WindTowerInfo;
@@ -12,6 +16,7 @@ import com.jiayue.biz.service.ProphaseWeatherDataService;
 import com.jiayue.biz.service.WindTowerDataParentTableService;
 import com.jiayue.biz.service.WindTowerInfoService;
 import com.jiayue.biz.service.impl.AnalysisDataImpl;
+import com.jiayue.biz.service.impl.CheckDataRecode;
 import com.jiayue.biz.service.impl.EmailImpl;
 import com.jiayue.biz.util.CalculationUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -20,6 +25,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
 import java.math.RoundingMode;
 import java.sql.Timestamp;
 import java.util.*;
@@ -48,7 +54,6 @@ public class FileAnalysisJob {
 
     @Autowired
     ProphaseWeatherDataService prophaseWeatherDataService;
-
     public FileAnalysisJob(EmailImpl emailImpl) {
         this.emailImpl = emailImpl;
     }

+ 63 - 0
wrdep-biz/src/main/java/com/jiayue/biz/service/WindDataCalculation2Service.java

@@ -0,0 +1,63 @@
+package com.jiayue.biz.service;
+
+import com.jiayue.biz.domain.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface WindDataCalculation2Service {
+
+
+    ArrayList<WindTowerCalculationData> calcu(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo) throws Exception;
+
+    /**
+     * 重算
+     *
+     * @param dataList
+     * @param startDate
+     * @param endDate
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     * @param windTowerInfo
+     * @return
+     */
+    ArrayList<WindTowerCalculationData> calcuRe(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo);
+
+    /**
+     * 日均数据计算
+     *
+     * @param dataList
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     * @return
+     */
+    ArrayList<WindTowerCalculationData> calcuForDay(ArrayList<WindTowerCalculationData> dataList, String equipmentNo, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo);
+
+    /**
+     * 月均数据计算
+     *
+     * @param dataList
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @return
+     */
+    ArrayList<WindTowerCalculationData> calcuForMonth(ArrayList<WindTowerCalculationData> dataList, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , WindTowerInfo windTowerInfo) throws Exception;
+}

+ 1379 - 0
wrdep-biz/src/main/java/com/jiayue/biz/service/WindDataCalculation2ServiceImpl.java

@@ -0,0 +1,1379 @@
+package com.jiayue.biz.service;
+
+import cn.hutool.core.date.DateTime;
+import com.jiayue.biz.domain.*;
+import com.jiayue.biz.dto.SpeedAndDensityDto;
+import com.jiayue.biz.eunms.WindDirectionEnum;
+import com.jiayue.biz.service.impl.WindDirectionStatisticsDataServiceImpl;
+import com.jiayue.biz.util.CalculationUtil;
+import com.jiayue.biz.util.DateTimeUtil;
+import com.jiayue.common.utils.DateUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 风资源相关计算服务
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WindDataCalculation2ServiceImpl implements WindDataCalculation2Service {
+    private final String tDay = "tDay";
+    private final String paDay = "paDay";
+    private final String airDensity = "airDensity";
+    private final String shearFunction = "shear";
+    private final String turbulenceFunction = "turbulence";
+    private final String wsFunction = "ws";
+    private final String wsDayFunction = "wsDay";
+    private final String wsMonthFunction = "wsMonth";
+    private final String wsMaxMonthFunction = "maxWsMonth";
+    private final String turbulenceDay = "turbulenceDay";
+    private final String staDay = "staDay";
+
+    private final String windShearFiledName = "windShear";
+    private final String windShearDayFiledName = "windShearDay";
+
+    private final BigDecimal zero = new BigDecimal(0);
+    private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataServiceImpl;
+
+    /**
+     * 统一计算
+     *
+     * @param dataList
+     * @param startDate
+     * @param endDate
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     */
+    @Override
+    public ArrayList<WindTowerCalculationData> calcu(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo) throws Exception {
+
+        //获取对应测风塔数据
+        List<ProphaseAnemometryData> anemometryDataList = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startDate.getTime()
+                && p.getTs().getTime() <= endDate.getTime() && null != p.getWsAve() && p.getWsAve() > 0 && p.getWsAve() < 30).collect(Collectors.toList());
+        List<ProphaseWeatherData> weatherDataList = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startDate.getTime()
+                && p.getTs().getTime() <= endDate.getTime() && null != p.getAirDensity() && p.getAirDensity() > 0).collect(Collectors.toList());
+
+        //按层高分map
+        Map<String, List<ProphaseAnemometryData>> proAnemomentryDataHMap = anemometryDataList.stream().collect(Collectors.groupingBy(ProphaseAnemometryData::getLayerHeight));
+        Map<String, List<ProphaseWeatherData>> weatherDataHMap = weatherDataList.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForHH(x.getTs().getTime())));
+
+        //小时平均风速风功率密度
+        ArrayList<WindTowerCalculationData> wsAndWpdList = this.calculateWindPowerDensity(equipmentNo, proAnemomentryDataHMap, weatherDataHMap
+                , equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wsAndWpdList);
+        //每小时风切变指数
+        ArrayList<WindTowerCalculationData> windShearList = this.calculateWindPowerShear(equipmentNo, anemometryDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(windShearList);
+
+        //计算日均
+        calcuForDay(dataList, equipmentNo, anemometryDataList, prophaseWeatherDataList, equipmentAttributeMap, windTowerCalculationDataList, windTowerInfo);
+        //计算月均
+        calcuForMonth(dataList, equipmentNo, anemometryDataList, weatherDataList
+                , equipmentAttributeMap, windTowerInfo);
+
+        //删除时间段所有数据
+        windDirectionStatisticsDataServiceImpl.removeByStartTimeBetweenAndEquipmentIdAndEbId(startDate, endDate, equipmentNo, "");
+        //月玫瑰图
+        roseMonth(equipmentNo, proAnemomentryDataHMap, weatherDataList, equipmentAttributeMap, windTowerInfo, anemometryDataList);
+
+        return dataList;
+    }
+
+    /**
+     * 重算调用方法
+     *
+     * @param dataList
+     * @param startDate
+     * @param endDate
+     * @param equipmentNo
+     * @param prophaseAnemometryDataList
+     * @param prophaseWeatherDataList
+     * @param equipmentAttributeMap
+     * @param windTowerCalculationDataList
+     * @param windTowerInfo
+     * @return
+     */
+    @Override
+    public ArrayList<WindTowerCalculationData> calcuRe(ArrayList<WindTowerCalculationData> dataList, Date startDate, Date endDate, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo) {
+        return null;
+    }
+
+    @Override
+    public ArrayList<WindTowerCalculationData> calcuForDay(ArrayList<WindTowerCalculationData> dataList, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, List<WindTowerCalculationData> windTowerCalculationDataList, WindTowerInfo windTowerInfo
+    ) {
+        //日平均(温度/气压/空气密度)
+        ArrayList<WindTowerCalculationData> tList = this.tAndPaAndAirDensityDay(equipmentNo, prophaseWeatherDataList, equipmentAttributeMap);
+        dataList.addAll(tList);
+
+        Map<String, List<ProphaseAnemometryData>> proAnemomentryDataDayMap = prophaseAnemometryDataList.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForDay(x.getTs().getTime())));
+        //发电量与满发小时数
+        ArrayList<WindTowerCalculationData> calculateBattery = this.calculateBattery(windTowerInfo, proAnemomentryDataDayMap, equipmentAttributeMap);
+        dataList.addAll(calculateBattery);
+        //日平均风切变
+        ArrayList<WindTowerCalculationData> windShearDay = this.shearDay(equipmentNo, equipmentAttributeMap, windTowerInfo, proAnemomentryDataDayMap);
+        dataList.addAll(windShearDay);
+        //日平均风速标差
+        ArrayList<WindTowerCalculationData> staDay = this.calculateStaDay(equipmentNo, prophaseAnemometryDataList, equipmentAttributeMap);
+        dataList.addAll(staDay);
+        //日平均风速
+        ArrayList<WindTowerCalculationData> wsDayList = this.wsDay(equipmentNo, dataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wsDayList);
+        //日平均湍流
+        ArrayList<WindTowerCalculationData> turList = this.turbulenceDay(equipmentNo, equipmentAttributeMap, windTowerInfo, dataList);
+        dataList.addAll(turList);
+        //日平均风功率密度
+        ArrayList<WindTowerCalculationData> wpdDayList = this.wpdDay(equipmentNo, dataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wpdDayList);
+
+        return dataList;
+    }
+
+    @Override
+    public ArrayList<WindTowerCalculationData> calcuForMonth(ArrayList<WindTowerCalculationData> dataList, String equipmentNo
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap
+            , WindTowerInfo windTowerInfo) {
+        //月平均 数据计算
+        ArrayList<WindTowerCalculationData> wsMonth = this.avgMonth(equipmentNo, dataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wsMonth);
+        //月平均风切变
+        ArrayList<WindTowerCalculationData> shearMonth = this.shearMonth(equipmentNo, equipmentAttributeMap, windTowerInfo, prophaseAnemometryDataList);
+        dataList.addAll(shearMonth);
+        //月平均风速标差
+        ArrayList<WindTowerCalculationData> staMonth = this.staMonth(equipmentNo, prophaseAnemometryDataList, equipmentAttributeMap);
+        dataList.addAll(staMonth);
+        //月平均环境数据
+        ArrayList<WindTowerCalculationData> environmentData = this.environmentData(equipmentNo, prophaseWeatherDataList, equipmentAttributeMap);
+        dataList.addAll(environmentData);
+
+        //月最大风速
+        ArrayList<WindTowerCalculationData> wsMaxMonth = this.wsMaxMonth(equipmentNo, prophaseAnemometryDataList, equipmentAttributeMap, windTowerInfo);
+        dataList.addAll(wsMaxMonth);
+
+        //空气密度月逐时
+        ArrayList<WindTowerCalculationData> airDensityMonth = this.airDensityMonth(equipmentNo, prophaseWeatherDataList, equipmentAttributeMap);
+        dataList.addAll(airDensityMonth);
+        //湍流月逐时
+        ArrayList<WindTowerCalculationData> turbulenceHourForMonth = this.turbulenceHourForMonth(equipmentNo, prophaseAnemometryDataList, equipmentAttributeMap);
+        dataList.addAll(turbulenceHourForMonth);
+        return dataList;
+    }
+
+    /**
+     * 风功率密度和平均风速计算方法
+     */
+    public ArrayList<WindTowerCalculationData> calculateWindPowerDensity(String eqNo, Map<String, List<ProphaseAnemometryData>> proAnemomentryDataMap
+            , Map<String, List<ProphaseWeatherData>> weatherDataListMap
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+
+        String[] height = windTowerInfo.getHeights().split(",");
+        //定义数据空集合用来装载 结果数据
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            //遍历出过滤出的平均风速属性
+            for (String h : height) {
+                EquipmentAttribute equipmentAttributeAws = equipmentAttributeMap.get(h + "aws");
+                EquipmentAttribute equipmentAttributeWpd = equipmentAttributeMap.get(h + "wpd");
+                if (null == equipmentAttributeAws || null == equipmentAttributeWpd) {
+                    log.error("属性 {} 和 {} 信息查询失败,属性集合数量:{}", h + "aws", h + "wpd", equipmentAttributeMap.size());
+                    continue;
+                }
+                //当前层高的所有数据
+                List<ProphaseAnemometryData> anemometryDataOneHList = proAnemomentryDataMap.get(h);
+                if (null != anemometryDataOneHList && !anemometryDataOneHList.isEmpty()) {
+                    Map<String, List<ProphaseAnemometryData>> proAnemomentryOneHDataMap = anemometryDataOneHList.stream()
+                            .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForHH(x.getTs().getTime())));
+
+                    proAnemomentryOneHDataMap.forEach((key, anemometryData) -> {
+                        //根据层高获取所有风速数据
+                        List<BigDecimal> bigDecimals = anemometryData.stream().map((ProphaseAnemometryData p) -> {
+                            return BigDecimal.valueOf(p.getWsAve());
+                        }).collect(Collectors.toList());
+
+                        //风速数据时所有计算的根本,无数据不计算
+                        if (null == bigDecimals || bigDecimals.isEmpty()) {
+                            log.error("计算 {} 设备 层高:{} 小时:{} 的 平均风速和风功率密度 无有效数据", eqNo, h, key);
+                            return;
+                        }
+                        //环境数据过滤
+                        List<ProphaseWeatherData> weatherData = weatherDataListMap.get(key);
+
+                        if (null != weatherData && weatherData.size() > 0) {
+
+                            SpeedAndDensityDto speedAndDensityDto = getSpeedAndDensityDto(bigDecimals, anemometryData, weatherData);
+                            Date dataTime = DateUtil.parse(key + ":00:00");
+                            if (speedAndDensityDto.getWindPowerDensity().compareTo(BigDecimal.ZERO) < 0 ||
+                                    speedAndDensityDto.getWindSpeed().compareTo(BigDecimal.ZERO) < 0) {
+                                log.error("计算风功率密度/平均风速出现异常值 平均风速:{} 风功率密度:{};时间:{} ;设备编号:{}", speedAndDensityDto.getWindSpeed(), speedAndDensityDto.getWindPowerDensity(), dataTime, eqNo);
+                                return;
+                            }
+                            //保存平均风速
+                            list.add(new WindTowerCalculationData(dataTime, eqNo, equipmentAttributeAws.getId(), speedAndDensityDto.getWindSpeed()));
+                            //保存风功率密度
+                            list.add(new WindTowerCalculationData(dataTime, eqNo, equipmentAttributeWpd.getId(), speedAndDensityDto.getWindPowerDensity()));
+                        } else {
+                            log.error("计算 {} 设备平均风速和风功率密度 未查询到 时间:{}  层高:{} 的环境数据", eqNo, key, h);
+                        }
+                    });
+                }
+            }
+        } catch (Exception e) {
+            log.error("计算{}设备平均风速和风功率密度失败!!!{}", eqNo, e);
+        }
+        log.info("计算{}设备平均风速和风功率密度完成^ ^", eqNo);
+
+        return list;
+    }
+
+
+    /**
+     * 计算月平均风速标差
+     *
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> staMonth(String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        ArrayList<WindTowerCalculationData> windTowerCalculationDataList = new ArrayList<>();
+        prophaseAnemometryDataList = prophaseAnemometryDataList.stream().filter(p -> null != p.getWsSta() && p.getWsSta() >= 0).collect(Collectors.toList());
+        Map<String, List<ProphaseAnemometryData>> collect = prophaseAnemometryDataList.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+        collect.forEach((month, value) -> {
+
+            if (!value.isEmpty()) {
+                Map<String, List<ProphaseAnemometryData>> heightMap = value.stream()
+                        .collect(Collectors.groupingBy(x -> x.getLayerHeight()));
+                heightMap.forEach((height, hvalue) -> {
+                    try {
+                        if (!hvalue.isEmpty()) {
+                            EquipmentAttribute equipmentAttribute = equipmentAttributeMap.get(height + "staMonth");
+                            BigDecimal sumSta = CalculationUtil.getBigDecimal(hvalue.stream().mapToDouble(ProphaseAnemometryData::getWsSta).sum());
+                            BigDecimal valueAvgSta = sumSta.divide(new BigDecimal(collect.size()), 2, RoundingMode.HALF_UP);
+                            windTowerCalculationDataList.add(new WindTowerCalculationData(DateUtil.parse(month + "-01 00:00:00"), equipmentId, equipmentAttribute.getId(), valueAvgSta));
+                        } else {
+                            log.warn("设备:{} 层高:{} 计算月平均风速标差 的数据为空", equipmentId, height);
+                        }
+                    } catch (Exception e) {
+                        log.error("设备:{} 层高:{} 计算月平均风速标差 错误:{}", equipmentId, height, e);
+                    }
+                });
+            } else {
+                log.warn("设备:{} 月份:{} 计算月平均风速标差 的数据为空", equipmentId, month);
+            }
+
+        });
+
+        return windTowerCalculationDataList;
+    }
+
+
+    /**
+     * 温湿度气压月 最大,均值
+     *
+     * @param equipmentId           设备id
+     * @param equipmentAttributeMap 属性集合
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> environmentData(String equipmentId
+            , List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        ArrayList<WindTowerCalculationData> windTowerCalculationDataList = new ArrayList<>();
+        try {
+
+            Map<String, List<ProphaseWeatherData>> monthListMap = prophaseWeatherDataList.stream()
+                    .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+
+            monthListMap.forEach((month, value) -> {
+                if (value.isEmpty()) {
+                    log.error("计算温湿度气压数据时,原数据{prophaseWeatherData}为空");
+                    return;
+                }
+                Date monthTime = DateUtil.parse(month + "-01 00:00:00");
+                List<BigDecimal> paList = new ArrayList<>();
+                List<BigDecimal> rhList = new ArrayList<>();
+                List<BigDecimal> tList = new ArrayList<>();
+                /*计算平均值数值为null 不计算*/
+                for (ProphaseWeatherData map : value) {
+                    if (null != map.getPaAve() && map.getPaAve() > 0 && map.getPaAve() < 1200) {
+                        paList.add(CalculationUtil.getBigDecimal(map.getPaAve()));
+                    }
+                    if (null != map.getRhAve() && map.getRhAve() > 0 && map.getRhAve() < 100) {
+                        rhList.add(CalculationUtil.getBigDecimal(map.getRhAve()));
+                    }
+                    if (null != map.getTAve() && map.getTAve() >= -60 && map.getTAve() <= 60) {
+                        tList.add(CalculationUtil.getBigDecimal(map.getTAve()));
+                    }
+                }
+
+                commonCacuAveAndMaxAndMin(windTowerCalculationDataList, "t", tList, equipmentAttributeMap, monthTime, equipmentId);
+                commonCacuAveAndMaxAndMin(windTowerCalculationDataList, "rh", rhList, equipmentAttributeMap, monthTime, equipmentId);
+                commonCacuAveAndMaxAndMin(windTowerCalculationDataList, "pa", paList, equipmentAttributeMap, monthTime, equipmentId);
+            });
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return windTowerCalculationDataList;
+    }
+
+    /**
+     * 通用计算一组数据的 平均 最大 最小
+     *
+     * @param windTowerCalculationDataList
+     * @param dataFlagStr
+     * @param valueList
+     * @param equipmentAttributeMap
+     * @param monthTime
+     * @param equipmentId
+     */
+    private List<WindTowerCalculationData> commonCacuAveAndMaxAndMin(ArrayList<WindTowerCalculationData> windTowerCalculationDataList, String dataFlagStr, List<BigDecimal> valueList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, Date monthTime, String equipmentId) {
+        BigDecimal sumRh = BigDecimal.ZERO;
+        BigDecimal aveRh = BigDecimal.ZERO;
+        /*湿度*/
+        BigDecimal maxRh = BigDecimal.ZERO;
+        BigDecimal minRh = BigDecimal.ZERO;
+        if (!valueList.isEmpty()) {
+            maxRh = valueList.stream().max(BigDecimal::compareTo).get();
+            minRh = valueList.stream().min(BigDecimal::compareTo).get();
+            for (BigDecimal rh : valueList) {
+                sumRh = sumRh.add(rh);
+            }
+            aveRh = sumRh.divide(new BigDecimal(valueList.size()), 2, RoundingMode.HALF_UP);
+            windTowerCalculationDataList.add(new WindTowerCalculationData(monthTime, equipmentId, equipmentAttributeMap.get(dataFlagStr + "MAX").getId(), maxRh));
+            windTowerCalculationDataList.add(new WindTowerCalculationData(monthTime, equipmentId, equipmentAttributeMap.get(dataFlagStr + "MIN").getId(), minRh));
+            windTowerCalculationDataList.add(new WindTowerCalculationData(monthTime, equipmentId, equipmentAttributeMap.get(dataFlagStr + "AVE").getId(), aveRh));
+        }
+
+        return windTowerCalculationDataList;
+
+    }
+
+    /**
+     * 湍流月逐时
+     *
+     * @param equipmentId           设备Id
+     * @param equipmentAttributeMap 属性集合
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> turbulenceHourForMonth(String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+
+        Map<String, List<ProphaseAnemometryData>> monthListMap = prophaseAnemometryDataList.stream().filter(p -> null != p.getWsAve() && null != p.getWsSta()
+                        && p.getWsAve() >= 0 && p.getWsSta() >= 0 && p.getWsAve() <= 60 && p.getWsSta() <= 60)
+                .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        monthListMap.forEach((month, value) -> {
+            try {
+                if (!value.isEmpty()) {
+                    //各层高集合
+                    Map<String, List<ProphaseAnemometryData>> hListMap = value.stream()
+                            .collect(Collectors.groupingBy(x -> x.getLayerHeight()));
+                    //便利各层高数据
+                    hListMap.forEach((height, collect) -> {
+                        //获取湍流年逐时ebId
+                        String ebId = equipmentAttributeMap.get(height + "turDayForMonth").getId();
+                        //按小时分组 计算各小时数据
+                        Map<String, List<ProphaseAnemometryData>> hourListMap = collect.stream()
+                                .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForHour(x.getTs().getTime())));
+                        hourListMap.forEach((hour, dayList) -> {
+                            try {
+                                if (!dayList.isEmpty()) {
+                                    BigDecimal turAve = BigDecimal.ZERO;
+                                    //风速平均值
+                                    BigDecimal wsAvg = CalculationUtil.getBigDecimal(dayList.stream().mapToDouble(ProphaseAnemometryData::getWsAve).average().getAsDouble());
+                                    //风速标差平均值
+                                    BigDecimal wsStaAvg = CalculationUtil.getBigDecimal(dayList.stream().mapToDouble(ProphaseAnemometryData::getWsSta).average().getAsDouble());
+
+                                    turAve = wsStaAvg.divide(wsAvg, 2, BigDecimal.ROUND_UP);
+                                    if (turAve.doubleValue() >= 0) {
+                                        list.add(new WindTowerCalculationData(DateUtil.parse(month + "-01 " + hour + ":00:00"), equipmentId, ebId, turAve));
+                                    } else {
+                                        log.warn("计算逐时湍流强度错误,设备:{} 月份:{},层高:{} 小时:{} ", equipmentId, month, height, hour);
+                                    }
+
+                                } else {
+                                    log.warn("计算逐时湍流强度无该小时的数据,设备:{} 月份:{},层高:{} 小时:{} ", equipmentId, month, height, hour);
+                                }
+                            } catch (Exception e) {
+                                log.error("计算逐时湍流强度异常:{}", e);
+                            }
+                        });
+                    });
+                } else {
+                    log.error("计算设备:{}  月份:{} 无数据,无法计算 月最大风速", equipmentId, month);
+                }
+            } catch (Exception e) {
+                log.error("设备编号{}月最大风速计算错误:{}", equipmentId, e);
+            }
+        });
+        return list;
+    }
+
+
+    /**
+     * 空气密度月逐时入库
+     *
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> airDensityMonth(String equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        //获取ebId
+        String ebId = equipmentAttributeMap.get("airDensityDayForYear").getId();
+
+        try {
+            Map<String, List<ProphaseWeatherData>> monthListMap = prophaseWeatherDataList.stream()
+                    .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+            monthListMap.forEach((month, value) -> {
+                try {
+                    if (!value.isEmpty()) {
+                        //按小时分组 计算各小时数据
+                        Map<String, List<ProphaseWeatherData>> hourListMap = value.stream()
+                                .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForHour(x.getTs().getTime())));
+                        hourListMap.forEach((hour, dayList) -> {
+                            try {
+                                if (null != dayList && !dayList.isEmpty()) {
+                                    //风速平均值
+                                    BigDecimal airDensityAvg = CalculationUtil.getBigDecimal(dayList.stream().mapToDouble(ProphaseWeatherData::getAirDensity).average().getAsDouble());
+
+                                    if (airDensityAvg.doubleValue() >= 0) {
+                                        list.add(new WindTowerCalculationData(DateUtil.parse(month + "-01 " + hour + ":00:00"), equipmentId, ebId, airDensityAvg));
+                                    } else {
+                                        log.warn("计算逐时空气密度错误,设备:{} 月份:{},层高:{} 小时:{} ", equipmentId, month, hour);
+                                    }
+
+                                } else {
+                                    log.warn("计算逐时空气密度无该小时的数据,设备:{} 月份:{},层高:{} 小时:{} ", equipmentId, month, hour);
+                                }
+                            } catch (Exception e) {
+                                log.error("计算逐时空气密度 设备:{}  月份:{} 小时:{} 异常:{} ", equipmentId, month, hour, e);
+                            }
+                        });
+                    } else {
+                        log.error("计算设备:{}  月份:{} 无数据,无法计算 空气密度", equipmentId, month);
+                    }
+                } catch (Exception e) {
+                    log.error("计算逐时空气密度 设备:{}  月份:{} 异常:{} ", equipmentId, month, e);
+                }
+            });
+
+        } catch (Exception e) {
+            log.error("设备编号{},空气密度月逐时计算错误:{}", equipmentId, e);
+        }
+
+        log.info("设备编号{},空气密度月逐时,计算完成", equipmentId);
+        return list;
+
+    }
+
+
+    /**
+     * 计算日平均 温度/气压/空气密度
+     *
+     * @param equipmentId           设备Id
+     * @param equipmentAttributeMap 属性集合
+     */
+    public ArrayList<WindTowerCalculationData> tAndPaAndAirDensityDay(String equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+
+
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            //过滤温度,气压数据,空气密度前面已过滤
+            prophaseWeatherDataList = prophaseWeatherDataList.stream().filter(p -> null != p.getTAve() && null != p.getPaAve()
+                    && p.getTAve() >= -60 && p.getTAve() <= 100 && p.getPaAve() > 0 && p.getPaAve() < 1200).collect(Collectors.toList());
+            //按日组合环境数据
+            Map<String, List<ProphaseWeatherData>> weatherDataDayMap = prophaseWeatherDataList.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForDay(x.getTs().getTime())));
+
+            weatherDataDayMap.forEach((day, collect) -> {
+                if (collect.isEmpty()) {
+                    log.error("计算设备:{} 时间:{} 源数据为空,无法计算 日平均(温度/气压/空气密度) 数据", equipmentId, day);
+                    return;
+                }
+                Date dayTime = DateUtil.parse(day);
+                //=================================日平均(温度)===================================
+                try {
+                    String ebId = equipmentAttributeMap.get(tDay).getId();
+                    //计算时间段内所有温度
+                    BigDecimal tAvg = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getTAve).average().getAsDouble()).setScale(2, BigDecimal.ROUND_UP);
+                    list.add(new WindTowerCalculationData(dayTime, equipmentId, ebId, tAvg));
+                } catch (Exception e) {
+                    log.error("计算设备:{} 时间:{} 的日平均温度错误:{} ", equipmentId, dayTime, e);
+                }//=================================日平均(气压)===================================
+                try {
+                    String ebId = equipmentAttributeMap.get(paDay).getId();
+                    //计算时间段内所有温度
+                    BigDecimal paAvg = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getPaAve).average().getAsDouble()).setScale(2, BigDecimal.ROUND_UP);
+                    list.add(new WindTowerCalculationData(dayTime, equipmentId, ebId, paAvg));
+                } catch (Exception e) {
+                    log.error("计算设备:{} 时间:{} 的日平均气压错误:{} ", equipmentId, dayTime, e);
+                }
+
+                //=================================日平均(空气密度)===================================
+                try {
+                    String airDensityEbId = equipmentAttributeMap.get(airDensity).getId();
+                    //计算时间段内所有温度
+                    BigDecimal airDensityAvg = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getAirDensity).average().getAsDouble()).setScale(2, BigDecimal.ROUND_UP);
+                    if (airDensityAvg.doubleValue() < 0) {
+                        airDensityAvg = BigDecimal.ZERO;
+                    }
+                    list.add(new WindTowerCalculationData(dayTime, equipmentId, airDensityEbId, airDensityAvg));
+                } catch (Exception e) {
+                    log.error("计算设备:{} 时间:{} 的日平均空气密度错误:{} ", equipmentId, dayTime, e);
+                }
+
+            });
+        } catch (Exception e) {
+            log.error("设备{} 日平均(温度/气压/空气密度) 统计异常", equipmentId, e);
+        }
+        log.info(" {}设备日平均 (温度/气压/空气密度)  计算完成", equipmentId);
+        return list;
+    }
+
+    /**
+     * 日平均气压入库
+     *
+     * @param equipmentId           设备Id
+     * @param equipmentAttributeMap 属性集合
+     */
+    public ArrayList<WindTowerCalculationData> paDay(String equipmentId, Map<String, List<ProphaseWeatherData>> weatherDataHMap
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        String ebId = equipmentAttributeMap.get("paDay").getId();
+
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            weatherDataHMap.forEach((day, value) -> {
+                //过滤一天数据
+                List<ProphaseWeatherData> collect = value.stream().filter(p -> null != p.getPaAve() && p.getPaAve() > 0 && p.getPaAve() < 1200).collect(Collectors.toList());
+                if (collect.isEmpty()) {
+                    log.error("计算设备:{} 时间:{} 源数据为空,无法计算 日平均气压", equipmentId, day);
+                    return;
+                }
+                BigDecimal paAvg = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getPaAve).average().getAsDouble()).setScale(2, BigDecimal.ROUND_UP);
+
+                list.add(new WindTowerCalculationData(DateUtil.parse(day + " 00:00:00"), equipmentId, ebId, paAvg));
+            });
+
+        } catch (Exception e) {
+            log.error("设备{}日平均气压统计异常", equipmentId, e);
+        }
+        log.info("{}设备日平均气压计算完成", equipmentId);
+        return list;
+    }
+
+    /**
+     * 计算日平均空气密度
+     *
+     * @param equipmentId 设备ID
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> airDensityDay(String equipmentId, Map<String, List<ProphaseWeatherData>> weatherDataHMap
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+
+        //空气密度属性
+        EquipmentAttribute equipmentAttribute = equipmentAttributeMap.get("airDensity");
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            weatherDataHMap.forEach((day, collect) -> {
+                //存平均值
+                if (collect.isEmpty()) {
+                    log.error("计算设备:{} 时间:{} 源数据为空,无法计算 日平均空气密度", equipmentId, day);
+                    return;
+                }
+                BigDecimal airDensityAvg = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getAirDensity).average().getAsDouble()).setScale(2, BigDecimal.ROUND_UP);
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                windTowerCalculationData.setEbId(equipmentAttribute.getId());
+                windTowerCalculationData.setTime(DateUtil.parse(day));
+                windTowerCalculationData.setValue(airDensityAvg);
+                if (windTowerCalculationData.getValue().doubleValue() < 0) {
+                    windTowerCalculationData.setValue(zero);
+                }
+                list.add(windTowerCalculationData);
+            });
+        } catch (Exception e) {
+            log.error("计算日平均空气密度错误:{}", e);
+        }
+        log.info("计算日平均空气密度完成");
+        return list;
+    }
+
+    /**
+     * 计算上一个小时 每10分钟的风切变指数
+     */
+    public ArrayList<WindTowerCalculationData> calculateWindPowerShear(String equipmentId
+            , List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        log.info("开始计算小时风切变指数");
+        String[] heights = windTowerInfo.getHeights().split(",");
+        ArrayList<WindTowerCalculationData> listAll = new ArrayList<>();
+        //过滤数据
+        prophaseAnemometryDataList = prophaseAnemometryDataList.stream().filter(p -> null != p.getWsAve() && p.getWsAve() >= 3).collect(Collectors.toList());
+        String ebId = equipmentAttributeMap.get(windShearFiledName).getId();
+        try {
+            Map<String, List<ProphaseAnemometryData>> prophaseAnemometryDataHMap = prophaseAnemometryDataList.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForHH(x.getTs().getTime())));
+            prophaseAnemometryDataHMap.forEach((time, collect) -> {
+
+                //计算综合风切变
+                if (collect.isEmpty()) {
+                    log.error("计算设备:{} 时间:{} 源数据为空,无法计算 综合风切变", equipmentId, time);
+                    return;
+                }
+                BigDecimal windShear = CalculationUtil.getWindShear(collect, heights);
+                WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                windTowerCalculationData.setEquipmentId(equipmentId);
+                windTowerCalculationData.setTime(DateUtil.parse(time + ":00:00"));
+                windTowerCalculationData.setValue(windShear);
+                windTowerCalculationData.setEbId(ebId);
+                listAll.add(windTowerCalculationData);
+            });
+
+        } catch (Exception e) {
+            log.error("设备{}小时风切变统计异常:{}", equipmentId, e);
+        }
+        log.info("{}设备风切变指数计算完成", equipmentId);
+        return listAll;
+    }
+
+    /**
+     * 计算日发电量与满发小时数
+     */
+
+    public ArrayList<WindTowerCalculationData> calculateBattery(WindTowerInfo
+                                                                        windTowerInfo, Map<String, List<ProphaseAnemometryData>> proAnemomentryDataDayMap
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+
+        ArrayList<WindTowerCalculationData> batteryList = new ArrayList<>();
+        EquipmentAttribute batteryDay = equipmentAttributeMap.get("batteryDay");
+        //获取最高层高
+        String maxHeight = CalculationUtil.getNumberFromString(Arrays.asList(windTowerInfo.getHeights().split(",")).get(0));
+
+        proAnemomentryDataDayMap.forEach((day, value) -> {
+            try {
+                BigDecimal batterySum = value.stream().filter(p -> p.getLayerHeight().equals(maxHeight)).map(p -> CalculationUtil.getBattery(BigDecimal.valueOf(p.getWsAve()))).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                //日发电量
+                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.getId());
+                    windTowerCalculationData.setTime(DateUtil.beginOfDay(DateUtil.parse(day)));
+                    windTowerCalculationData.setEquipmentId(windTowerInfo.getEquipmentNo());
+                    batteryList.add(windTowerCalculationData);
+                }
+            } catch (Exception e) {
+                log.error("计算日发电量与满发小时数 错误:{}", e);
+            }
+        });
+        return batteryList;
+    }
+
+
+    /**
+     * 计算日平均风速
+     *
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> wsDay(String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+
+        //获取测风塔所有层高
+        String[] strings = windTowerInfo.getHeights().split(",");
+        Map<String, List<WindTowerCalculationData>> windTowerCalculationDataListMap = windTowerCalculationDataList.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForDay(x.getTime().getTime())));
+
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+
+            windTowerCalculationDataListMap.forEach((day, value) -> {
+
+                if (value.isEmpty()) {
+                    log.error("计算设备:{} 日期:{} 的 数据为空,无法计算 日平均风速", equipmentId, day);
+                    return;
+                }
+
+                //遍历测风塔所有层高
+                for (String h : strings) {
+                    //获取小时风速表
+                    EquipmentAttribute awsEq = equipmentAttributeMap.get(h + "aws");
+                    //获取日风速表
+                    EquipmentAttribute awsDayEq = equipmentAttributeMap.get(h + "awsDay");
+
+                    //根据小时平均风速计算日均风速
+                    List<WindTowerCalculationData> wsCalDataList = value.stream().filter(
+                                    w -> w.getEquipmentId().equals(equipmentId) &&
+                                            w.getEbId().equals(awsEq.getId()))
+                            .collect(Collectors.toList()
+                            );
+
+                    if (!wsCalDataList.isEmpty()) {
+                        BigDecimal wsDayAvg = CalculationUtil.getBigDecimal(wsCalDataList.stream().mapToDouble(x -> x.getValue().doubleValue()).average().getAsDouble()).setScale(2, BigDecimal.ROUND_UP);
+                        WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                        windTowerCalculationData.setEquipmentId(equipmentId);
+                        windTowerCalculationData.setValue(wsDayAvg);
+                        windTowerCalculationData.setEbId(awsDayEq.getId());
+                        windTowerCalculationData.setTime(cn.hutool.core.date.DateUtil.parse(day));
+                        list.add(windTowerCalculationData);
+                    } else {
+                        log.warn("日期:{} 过滤小时风速平均之后集合为空,无法计算日平均风速", day);
+                    }
+                }
+            });
+
+        } catch (Exception e) {
+            log.error("设备编号{}日平均风速计算错误:{}", equipmentId, e);
+        }
+
+        log.info("设备编号{}米层高日平均风速计算完成", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 计算日平均风功率密度
+     *
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> wpdDay(String
+                                                              equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+
+        Map<String, List<WindTowerCalculationData>> windTowerCalculationDataListMap = windTowerCalculationDataList.stream()
+                .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForDay(x.getTime().getTime())));
+
+        String[] heightAll = windTowerInfo.getHeights().split(",");
+        //结果集合
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            windTowerCalculationDataListMap.forEach((day, value) -> {
+                Map<String, List<WindTowerCalculationData>> windTowerCalculationDataHMap = value.stream().collect(Collectors.groupingBy(x -> x.getEbId()));
+                for (String h : heightAll) {
+
+                    //获取所有小时风功率表
+                    EquipmentAttribute wpdList = equipmentAttributeMap.get(h + "wpd");
+                    //获取所有日风功率表
+                    EquipmentAttribute wpdDayList = equipmentAttributeMap.get(h + "wpdDay");
+                    List<WindTowerCalculationData> wpdCalDataList = windTowerCalculationDataHMap.get(wpdList.getId());
+
+                    if (null != wpdCalDataList && !wpdCalDataList.isEmpty()) {
+                        //小时风功率总值
+                        BigDecimal wpdSum = BigDecimal.ZERO;
+                        for (WindTowerCalculationData wpd : wpdCalDataList) {
+                            wpdSum = wpdSum.add(wpd.getValue());
+                        }
+                        WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                        windTowerCalculationData.setEquipmentId(equipmentId);
+                        windTowerCalculationData.setValue(wpdSum.divide(BigDecimal.valueOf(wpdCalDataList.size()), 2, RoundingMode.HALF_UP));
+                        windTowerCalculationData.setEbId(wpdDayList.getId());
+                        windTowerCalculationData.setTime(DateUtil.parse(day));
+                        list.add(windTowerCalculationData);
+
+                    } else {
+                        log.error("计算设备:{}  日期:{} 的数据为空,无法计算 平均风功率密度", equipmentId, day);
+                    }
+                }
+            });
+        } catch (Exception e) {
+            log.error("设备编号{}日平均风功率密度计算错误:{}", equipmentId, e);
+        }
+
+        log.info("设备编号{}日平均风功率密度计算完成^ ^", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 计算日平均风速标差
+     *
+     * @param equipmentId           测风塔编号
+     * @param equipmentAttributeMap 属性表
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> calculateStaDay(String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap) {
+        ArrayList<WindTowerCalculationData> dataList = new ArrayList<>();
+        prophaseAnemometryDataList = prophaseAnemometryDataList.stream().filter(p -> null != p.getWsSta() && p.getWsSta() >= 0 && p.getWsSta() <= 100).collect(Collectors.toList());
+        //按层高分map
+        Map<String, List<ProphaseAnemometryData>> proAnemomentryDataHMap = prophaseAnemometryDataList.stream().collect(Collectors.groupingBy(ProphaseAnemometryData::getLayerHeight));
+        try {
+            proAnemomentryDataHMap.forEach((h, value) -> {
+                //获取对应层高的属性
+                EquipmentAttribute equipmentAttributes = equipmentAttributeMap.get(h + "staDay");
+                Map<String, List<ProphaseAnemometryData>> proAnemomentryDataDayMap = value.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForDay(x.getTs().getTime())));
+                proAnemomentryDataDayMap.forEach((day, collect) -> {
+                    if (collect.size() > 0) {
+                        BigDecimal staSum = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseAnemometryData::getWsSta).sum());
+                        WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                        windTowerCalculationData.setEquipmentId(equipmentId);
+                        windTowerCalculationData.setTime(DateUtil.parse(day));
+                        windTowerCalculationData.setValue(staSum.divide(CalculationUtil.getBigDecimal(collect.size()), 2, RoundingMode.HALF_UP));
+                        windTowerCalculationData.setEbId(equipmentAttributes.getId());
+                        dataList.add(windTowerCalculationData);
+                    } else {
+                        log.error("计算设备:{}  源数据为空,无法计算 日平均风速标差", equipmentId);
+                    }
+                });
+            });
+
+        } catch (Exception e) {
+            log.error("设备编号{}日平均风速标差计算错误:{} ", equipmentId, e);
+        }
+        log.info("设备编号{},风速标差数据计算完成", equipmentId);
+        return dataList;
+
+    }
+
+
+    /**
+     * 计算日平均湍流
+     *
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> turbulenceDay(String equipmentId, Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo
+            windTowerInfo, List<WindTowerCalculationData> windTowerCalculationDataList) {
+        Map<String, List<WindTowerCalculationData>> windTowerCalculationDataListMap = windTowerCalculationDataList.stream()
+                .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForDay(x.getTime().getTime())));
+
+        String[] heightAll = windTowerInfo.getHeights().split(",");
+        //结果集合
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            windTowerCalculationDataListMap.forEach((day, value) -> {
+                Map<String, List<WindTowerCalculationData>> windTowerCalculationDataHMap = value.stream().collect(Collectors.groupingBy(x -> x.getEbId()));
+                for (String h : heightAll) {
+
+                    EquipmentAttribute turAttribute = equipmentAttributeMap.get(h + turbulenceDay);
+                    EquipmentAttribute staAttribute = equipmentAttributeMap.get(h + staDay);
+                    EquipmentAttribute wsAttribute = equipmentAttributeMap.get(h + "awsDay");
+                    List<WindTowerCalculationData> staDay = windTowerCalculationDataHMap.get(staAttribute.getId());
+                    List<WindTowerCalculationData> wsDay = windTowerCalculationDataHMap.get(wsAttribute.getId());
+
+                    if (null != staDay && null != wsDay && !staDay.isEmpty() && !wsDay.isEmpty()) {
+                        //数据入库
+                        WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                        windTowerCalculationData.setTime(DateUtil.parse(day));
+                        windTowerCalculationData.setEbId(turAttribute.getId());
+                        windTowerCalculationData.setEquipmentId(equipmentId);
+                        windTowerCalculationData.setValue(CalculationUtil.caTurbulenceIntensity(staDay.get(0).getValue(), wsDay.get(0).getValue()));
+                        list.add(windTowerCalculationData);
+                    } else {
+                        log.error("计算设备:{}  日期:{} 的数据为空,无法计算 日平均湍流", equipmentId, day);
+                    }
+                }
+
+            });
+        } catch (Exception e) {
+            log.error("设备编号{}日平均湍流计算错误:{}", equipmentId, e);
+        }
+        log.info("设备编号{}日平均湍流计算完成", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 计算月最大风速
+     *
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> wsMaxMonth(String
+                                                                  equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+
+        prophaseAnemometryDataList = prophaseAnemometryDataList.stream().filter(p -> null != p.getWsMax() && p.getWsMax() >= 0 && p.getWsMax() <= 50).collect(Collectors.toList());
+        Map<String, List<ProphaseAnemometryData>> monthListMap = prophaseAnemometryDataList.stream()
+                .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        monthListMap.forEach((month, value) -> {
+            try {
+                if (!value.isEmpty()) {
+                    //各层高集合
+                    Map<String, List<ProphaseAnemometryData>> hListMap = value.stream()
+                            .collect(Collectors.groupingBy(x -> x.getLayerHeight()));
+                    hListMap.forEach((h, collect) -> {
+                        //获取对应层高的字段
+                        String ebIdMonth = equipmentAttributeMap.get(h + "maxwsMonth").getId();
+
+                        BigDecimal max = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseAnemometryData::getWsMax).sum());
+                        BigDecimal maxWsValue = max.divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP);
+                        list.add(new WindTowerCalculationData(DateUtil.parse(month + "-01 00:00:00"), equipmentId, ebIdMonth, maxWsValue));
+                    });
+
+                } else {
+                    log.error("计算设备:{}  月份:{} 无数据,无法计算 月最大风速", equipmentId, month);
+                }
+            } catch (Exception e) {
+                log.error("设备编号{}月最大风速计算错误:{}", equipmentId, e);
+            }
+        });
+        //获取所有层高
+        String[] height = windTowerInfo.getHeights().split(",");
+
+
+        log.info("设备编号{}月最大风速计算完成^ ^", equipmentId);
+        return list;
+    }
+
+    /**
+     * 计算月平均风速
+     *
+     * @param equipmentId 设备编号
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> avgMonth(String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo) {
+        try {
+            //按月分组
+            Map<String, List<WindTowerCalculationData>> windTowerCalculationDataMonthMap = windTowerCalculationDataList.stream()
+                    .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTime().getTime())));
+            ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+            windTowerCalculationDataMonthMap.forEach((month, value) -> {
+                Map<String, List<WindTowerCalculationData>> windTowerCalculationDataEbIdMap = value.stream().collect(Collectors.groupingBy(x -> x.getEbId()));
+                String[] height = windTowerInfo.getHeights().split(",");
+                for (String h : height) {
+
+                    try {
+                        //=============================================计算月平均风速======================================================================
+                        String ebIdDay = equipmentAttributeMap.get(h + "awsDay").getId();
+                        String ebIdMonth = equipmentAttributeMap.get(h + "awsMonth").getId();
+                        cacluMonthAvg(ebIdDay, ebIdMonth, windTowerCalculationDataEbIdMap, list, month, equipmentId, "计算月平均风速");
+
+                    } catch (Exception e) {
+                        log.error("设备编号 {} 时间:{} 层高:{} 计算月平均风速 错误:{}", equipmentId, month, h, e);
+                    }
+                    try {
+                        //=============================================计算月平均风功率密度======================================================================
+                        String ebIdDay = equipmentAttributeMap.get(h + "wpdDay").getId();
+                        String ebIdMonth = equipmentAttributeMap.get(h + "wpdMonth").getId();
+                        cacluMonthAvg(ebIdDay, ebIdMonth, windTowerCalculationDataEbIdMap, list, month, equipmentId, "计算月平均风功率密度");
+                    } catch (Exception e) {
+                        log.error("设备编号 {} 时间:{} 层高:{} 计算月平均风功率密度 错误:{}", equipmentId, month, h, e);
+                    }
+                    try {
+                        //=============================================计算月平均湍流======================================================================
+                        String ebIdDay = equipmentAttributeMap.get(h + "turbulenceDay").getId();
+                        String ebIdMonth = equipmentAttributeMap.get(h + "turbulenceMonth").getId();
+                        cacluMonthAvg(ebIdDay, ebIdMonth, windTowerCalculationDataEbIdMap, list, month, equipmentId, "计算月平均湍流");
+                    } catch (Exception e) {
+                        log.error("设备编号 {} 时间:{} 层高:{} 计算月平均湍流 错误:{}", equipmentId, month, h, e);
+                    }
+                }
+
+                try {
+                    //=============================================计算月平均空气密度======================================================================
+                    String ebIdDay = equipmentAttributeMap.get("airDensity").getId();
+                    String ebIdMonth = equipmentAttributeMap.get("airDensityMonth").getId();
+                    cacluMonthAvg(ebIdDay, ebIdMonth, windTowerCalculationDataEbIdMap, list, month, equipmentId, "计算月平均空气密度");
+                } catch (Exception e) {
+                    log.error("设备编号 {} 时间:{}  计算月平均空气密度 错误:{}", equipmentId, month, e);
+                }
+            });
+            log.info("{}设备 月平均风速/月平均空气密度/月平均风功率密度/月平均湍流/ 统计完成", equipmentId);
+            return list;
+        } catch (Exception e) {
+            log.error("设备编号{}月平均风速计算错误:{}", equipmentId, e);
+        }
+        return null;
+
+    }
+
+    /**
+     * 计算月风切变入库
+     *
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> shearMonth(String equipmentId
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo
+                                                                  windTowerInfo, List<ProphaseAnemometryData> prophaseAnemometryDataList) {
+        //获取时间段所有统计数据
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            //获取月平均综合风切变字段
+            String ebIdMonth = equipmentAttributeMap.get("windShearMonth").getId();
+
+            String heights = windTowerInfo.getHeights();
+            prophaseAnemometryDataList = prophaseAnemometryDataList.stream().filter(p -> null != p.getWsAve() && p.getWsAve() >= 3).collect(Collectors.toList());
+            Map<String, List<ProphaseAnemometryData>> collect = prophaseAnemometryDataList.stream()
+                    .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+            collect.forEach((month, value) -> {
+                BigDecimal windShear = CalculationUtil.getWindShear(value, heights.split(","));
+
+                if (value.size() > 0) {
+                    WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                    windTowerCalculationData.setEbId(ebIdMonth);
+                    windTowerCalculationData.setTime(DateUtil.parse(month + "-01 00:00:00"));
+                    windTowerCalculationData.setEquipmentId(equipmentId);
+                    windTowerCalculationData.setValue(windShear);
+                    list.add(windTowerCalculationData);
+                } else {
+                    log.error("计算设备:{}  源数据为空,无法计算 月平均风月切变", equipmentId);
+                }
+            });
+
+        } catch (Exception e) {
+            log.error("设备编号{}月平均风月切变计算错误{}", equipmentId, e);
+        }
+        log.info("设备编号{}月平均风切变计算完成", equipmentId);
+        return list;
+    }
+
+    /**
+     * 根据日统计数据计算
+     * 通用计算月平均数据
+     *
+     * @param dayEqId
+     * @param monthEqId
+     * @param windTowerCalculationDataEbIdMap
+     * @param list                            最后保存数据集合
+     * @param month
+     * @param equipmentId
+     * @param dataFlagStr                     日志打印标识
+     */
+    public void cacluMonthAvg(String dayEqId, String monthEqId,
+                              Map<String, List<WindTowerCalculationData>> windTowerCalculationDataEbIdMap
+            , ArrayList<WindTowerCalculationData> list, String month, String equipmentId, String dataFlagStr) {
+        try {
+            //获取所有日平均数据
+            List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataEbIdMap.get(dayEqId);
+            if (null != windTowerCalculationDatas && !windTowerCalculationDatas.isEmpty()) {
+                BigDecimal wsSum = new BigDecimal(0);
+                //日统计数据累加
+                for (WindTowerCalculationData w : windTowerCalculationDatas) {
+                    wsSum = wsSum.add(w.getValue());
+                }
+                //计算平均值
+                BigDecimal awsMonthValue = wsSum.divide(new BigDecimal(windTowerCalculationDatas.size()), 2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                list.add(new WindTowerCalculationData(DateUtil.parse(month + "-01 00:00:00"), equipmentId, monthEqId, awsMonthValue));
+            } else {
+                log.warn("设备 {} 时间:{}  计算 {} 无数据", equipmentId, month, dataFlagStr);
+            }
+        } catch (Exception e) {
+            log.error("设备编号 {} 时间:{}  计算 {} 错误:{}", equipmentId, month, dataFlagStr, e);
+        }
+    }
+
+    /**
+     * 计算日风切变入库
+     *
+     * @param equipmentId 设备id
+     * @return
+     */
+    public ArrayList<WindTowerCalculationData> shearDay(String equipmentId, Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo
+            windTowerInfo, Map<String, List<ProphaseAnemometryData>> proAnemomentryDataDayMap) {
+        String[] heights = windTowerInfo.getHeights().split(",");
+
+        ArrayList<WindTowerCalculationData> list = new ArrayList<>();
+        try {
+            //获取日综合风切变
+            EquipmentAttribute shearDayList = equipmentAttributeMap.get(windShearDayFiledName);
+            proAnemomentryDataDayMap.forEach((day, value) -> {
+                List<ProphaseAnemometryData> collect = value.stream().filter(p -> null != p.getWsAve() && p.getWsAve() >= 3).collect(Collectors.toList());
+                BigDecimal windShear = CalculationUtil.getWindShear(collect, heights);
+                if (collect.size() > 0) {
+                    WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
+                    windTowerCalculationData.setEquipmentId(equipmentId);
+                    windTowerCalculationData.setValue(windShear);
+                    windTowerCalculationData.setEbId(shearDayList.getId());
+                    windTowerCalculationData.setTime(DateUtil.parse(day));
+                    list.add(windTowerCalculationData);
+                } else {
+                    log.error("计算设备:{}  源数据为空,无法计算 日平均风切变", equipmentId);
+                }
+            });
+        } catch (Exception e) {
+            log.error("设备编号{}日平均风切变计算错误", equipmentId, e);
+            e.printStackTrace();
+        }
+        log.info("设备编号{}日平均风切变计算完成", equipmentId);
+        return list;
+    }
+
+
+    /**
+     * 玫瑰图 数据计算
+     */
+    public void roseMonth(String equipmentId, Map<String, List<ProphaseAnemometryData>> proAnemomentryDataHMap, List<ProphaseWeatherData> prophaseWeatherDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, WindTowerInfo windTowerInfo, List<ProphaseAnemometryData> anemometryDataList) {
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        Map<String, List<ProphaseWeatherData>> weatherCollectMonth = prophaseWeatherDataList.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+        //获取所有 风向层高 不是所有层高都有风向数据
+        String[] heights = windTowerInfo.getWdHeights().split(",");
+        List<String> heightList = Arrays.asList(heights);
+
+        proAnemomentryDataHMap.forEach((height, valueHeightList) -> {
+
+            if (!heightList.contains(height)) {
+                return;
+            }
+            if (!valueHeightList.isEmpty()) {
+
+                Map<String, List<ProphaseAnemometryData>> collectMonth = valueHeightList.stream()
+                        .collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+                collectMonth.forEach((month, valueList) -> {
+                    Date time = DateUtil.parse(month + "-01 00:00:00");
+                    //风向玫瑰图
+                    ArrayList<WindDirectionStatisticsData> wdRose = wdRose(equipmentId, valueList, equipmentAttributeMap, height, time);
+                    list.addAll(wdRose);
+                    //湍流玫瑰图
+                    ArrayList<WindDirectionStatisticsData> turRose = turRose(equipmentId, valueList, equipmentAttributeMap, height, time);
+                    list.addAll(turRose);
+
+                    //风功率玫瑰图
+                    ArrayList<WindDirectionStatisticsData> powerRose = powerRose(equipmentId, valueList, weatherCollectMonth.get(month), equipmentAttributeMap, height, time);
+                    list.addAll(powerRose);
+                });
+
+
+            } else {
+                log.info("设备编号 {}, 层高:{},月玫瑰图计算失败,无测风塔数据^ ^", equipmentId, height);
+            }
+        });
+
+        //风切变玫瑰图
+        Map<String, List<ProphaseAnemometryData>> anemometryMonthMap = anemometryDataList.stream().collect(Collectors.groupingBy(x -> DateTimeUtil.getFormatDateStrForMonth(x.getTs().getTime())));
+        anemometryMonthMap.forEach((month, value) -> {
+            ArrayList<WindDirectionStatisticsData> windShearRose = windShearRose(equipmentId, value, equipmentAttributeMap, heights, DateUtil.parse(month + "-01 00:00:00"));
+            list.addAll(windShearRose);
+        });
+
+        windDirectionStatisticsDataServiceImpl.saveBatch(list);
+
+
+    }
+
+    /**
+     * 风向玫瑰图统计计算
+     */
+    public ArrayList<WindDirectionStatisticsData> wdRose(String equipmentId, List<ProphaseAnemometryData> anemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, String height, Date time) {
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        try {
+            String ebIdMonth = equipmentAttributeMap.get(height + "monthWdRose").getId();
+            for (WindDirectionEnum value : WindDirectionEnum.values()) {
+                List<ProphaseAnemometryData> forHeightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(anemometryDataList, value);
+                if (!forHeightAndWindDirectionEnum.isEmpty()) {
+                    WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
+                    windDirectionStatisticsData.setEbId(ebIdMonth);
+                    windDirectionStatisticsData.setTime(time);
+                    windDirectionStatisticsData.setEquipmentId(equipmentId);
+                    windDirectionStatisticsData.setDirection(value.name());
+                    windDirectionStatisticsData.setValue(BigDecimal.valueOf(100).multiply(BigDecimal.valueOf(forHeightAndWindDirectionEnum.size())).divide(BigDecimal.valueOf(anemometryDataList.size()), 2, RoundingMode.HALF_UP));
+                    list.add(windDirectionStatisticsData);
+                } else {
+                    log.error("计算设备:{}  层高:{} 数据为空,无法计算 风向玫瑰图统计", equipmentId, height);
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 风功率玫瑰图统计计算
+     */
+    public ArrayList<WindDirectionStatisticsData> powerRose(String equipmentId, List<ProphaseAnemometryData> anemometryDataList
+            , List<ProphaseWeatherData> prophaseWeatherDataList, Map<String, EquipmentAttribute> equipmentAttributeMap, String height, Date time) {
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        try {
+            String ebIdMonth = equipmentAttributeMap.get(height + "monthPowerRose").getId();
+            if (null != prophaseWeatherDataList && prophaseWeatherDataList.size() > 0) {
+                Map<String, ProphaseWeatherData> prophaseWeatherDataMap = prophaseWeatherDataList.stream().collect(Collectors.toMap(x -> x.getTs().getTime() + "", x -> x, (x1, x2) -> x1));
+                for (WindDirectionEnum value : WindDirectionEnum.values()) {
+                    List<ProphaseAnemometryData> forHeightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(anemometryDataList, value);
+                    if (!forHeightAndWindDirectionEnum.isEmpty()) {
+                        //根据风向获取风能数
+                        BigDecimal bigDecimal = CalculationUtil.windEnergyDensity(forHeightAndWindDirectionEnum, prophaseWeatherDataMap);
+                        // 数据集合
+                        WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
+                        windDirectionStatisticsData.setEbId(ebIdMonth);
+                        windDirectionStatisticsData.setTime(time);
+                        windDirectionStatisticsData.setEquipmentId(equipmentId);
+                        windDirectionStatisticsData.setDirection(value.name());
+                        windDirectionStatisticsData.setValue(bigDecimal.equals(new BigDecimal(-99)) ? zero : bigDecimal);
+                        list.add(windDirectionStatisticsData);
+                    } else {
+                        log.error("计算设备:{}  层高:{} 时间:{} 数据为空,无法计算 风功率玫瑰图统计", equipmentId, height, time);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 湍流玫瑰图统计计算
+     */
+    public ArrayList<WindDirectionStatisticsData> turRose(String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, String height, Date time) {
+        BigDecimal zero = new BigDecimal(0);
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        try {
+            String ebIdMonth = equipmentAttributeMap.get(height + "monthTurRose").getId();
+            for (WindDirectionEnum value : WindDirectionEnum.values()) {
+                List<ProphaseAnemometryData> heightAndWindDirectionEnum = CalculationUtil.getForHeightAndWindDirectionEnum(prophaseAnemometryDataList, value);
+
+                if (!heightAndWindDirectionEnum.isEmpty()) {
+                    //获取指定层高风速数据
+                    List<BigDecimal> wsForHeight = heightAndWindDirectionEnum.stream().map((ProphaseAnemometryData p) ->
+                            {
+                                return CalculationUtil.getBigDecimal(p.getWsAve());
+                            }
+                    ).collect(Collectors.toList());
+
+                    //删除值为null的数据
+                    wsForHeight.removeAll(Collections.singletonList(null));
+                    //平均风速
+                    BigDecimal avgWindSpeed = CalculationUtil.getAvgWind(wsForHeight);
+                    //获取指定层高标差数据集合
+                    List<BigDecimal> staForHeight = heightAndWindDirectionEnum.stream().filter(h -> h.getWsSta() != null && h.getWsSta() != 0 && h.getWsSta() != -99).map((ProphaseAnemometryData p) ->
+                            {
+                                return CalculationUtil.getBigDecimal(p.getWsSta());
+                            }
+                    ).collect(Collectors.toList());
+                    //平均风速标准差
+                    BigDecimal avgWindSpeedSta = CalculationUtil.getAvgWind(staForHeight);
+                    // 湍流
+                    BigDecimal bigDecimal = CalculationUtil.caTurbulenceIntensity(avgWindSpeedSta, avgWindSpeed);
+                    // 数据集合
+                    WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
+                    windDirectionStatisticsData.setEbId(ebIdMonth);
+                    windDirectionStatisticsData.setTime(time);
+                    windDirectionStatisticsData.setEquipmentId(equipmentId);
+                    windDirectionStatisticsData.setDirection(value.name());
+                    windDirectionStatisticsData.setValue(bigDecimal.equals(new BigDecimal(-99)) ? zero : bigDecimal);
+                    list.add(windDirectionStatisticsData);
+                } else {
+                    log.error("计算设备:{} 层高:{} 时间:{}  数据为空,无法计算 湍流玫瑰图统计", equipmentId, height, time);
+                }
+
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+    /**
+     * 风切变玫瑰图统计计算
+     */
+    public ArrayList<WindDirectionStatisticsData> windShearRose(String equipmentId, List<ProphaseAnemometryData> anemometryDataList
+            , Map<String, EquipmentAttribute> equipmentAttributeMap, String[] heights, DateTime time) {
+        ArrayList<WindDirectionStatisticsData> list = new ArrayList<>();
+        //设置最小层高  数值越大越好
+        int heightMin = 100;
+        try {
+            //设置临时层高 用于比较
+            int finalHeight = 10;
+            for (String height : heights) {
+                // 若是此层高是第二同层高
+                if (!height.contains("A")) {
+                    finalHeight = Integer.parseInt(height);
+                } else {
+                    continue;
+                }
+                if (finalHeight < heightMin) {
+                    heightMin = Integer.parseInt(height);
+                }
+            }
+            for (String height : heights) {
+                //如果层高等于最小增高则跳出循环
+                if (height.equals(String.valueOf(heightMin))) {
+                    continue;
+                }
+                String ebIdMonth = equipmentAttributeMap.get(height + "monthShearRose").getId();
+                for (WindDirectionEnum value : WindDirectionEnum.values()) {
+
+                    List<ProphaseAnemometryData> heightAndWindDirectionList = CalculationUtil.getForHeightAndWindDirectionEnum(anemometryDataList, value);
+                    if (!heightAndWindDirectionList.isEmpty()) {
+
+                        Map<String, List<ProphaseAnemometryData>> heightAndWindDirectionEnumMap = heightAndWindDirectionList.stream().collect(Collectors.groupingBy(ProphaseAnemometryData::getLayerHeight));
+                        //获取指定层高风速数据
+                        List<ProphaseAnemometryData> height1List = heightAndWindDirectionEnumMap.get(height);
+                        if (null != height1List && height1List.size() > 0) {
+                            //计算当前层高平均风速
+                            BigDecimal avgWindSpeed = BigDecimal.valueOf(height1List.stream().collect(Collectors.averagingDouble(ProphaseAnemometryData::getWsAve))).setScale(2, RoundingMode.HALF_UP);
+
+                            //获取指定最小层高风速数据
+                            String finalHeightMin = String.valueOf(heightMin);
+                            List<ProphaseAnemometryData> height2List = heightAndWindDirectionEnumMap.get(finalHeightMin);
+                            if (null != height2List && height2List.size() > 0) {
+                                //计算当前层高平均风速
+                                BigDecimal minAvgWindSpeed = BigDecimal.valueOf(height2List.stream().collect(Collectors.averagingDouble(ProphaseAnemometryData::getWsAve))).setScale(2, RoundingMode.HALF_UP);
+                                BigDecimal bigDecimal = BigDecimal.ZERO;
+
+                                if (minAvgWindSpeed.compareTo(BigDecimal.ZERO) != 0) {
+                                    //计算风切变值
+                                    bigDecimal = CalculationUtil.caWindShear(avgWindSpeed, minAvgWindSpeed, new BigDecimal(height), new BigDecimal(heightMin));
+                                }
+                                // 数据集合
+                                WindDirectionStatisticsData windDirectionStatisticsData = new WindDirectionStatisticsData();
+                                windDirectionStatisticsData.setEbId(ebIdMonth);
+                                windDirectionStatisticsData.setTime(time);
+                                windDirectionStatisticsData.setEquipmentId(equipmentId);
+                                windDirectionStatisticsData.setDirection(value.name());
+                                windDirectionStatisticsData.setValue(bigDecimal);
+                                list.add(windDirectionStatisticsData);
+                            } else {
+                                log.warn("计算设备:{} 风切变玫瑰图 未查询到最小层高:{} 时间:{} 的数据", equipmentId, finalHeightMin, time);
+                            }
+                        } else {
+                            log.warn("计算设备:{} 风切变玫瑰图 未查询到指定层高:{} 时间:{} 的数据", equipmentId, height, time);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.warn("计算设备:{}  时间:{} 的 风切变玫瑰图 错误:{}", equipmentId, time, e);
+        }
+        return list;
+    }
+
+    /**
+     * 获取风况数据(平均风速,风功率密度)
+     *
+     * @param bigDecimalList 风速数据
+     * @return
+     */
+    public SpeedAndDensityDto getSpeedAndDensityDto(List<BigDecimal> bigDecimalList, List<ProphaseAnemometryData> anemometryData, List<ProphaseWeatherData> weatherData) {
+
+        SpeedAndDensityDto speedAndDensityDto = new SpeedAndDensityDto();
+        BigDecimal avgWindSpeed = BigDecimal.valueOf(bigDecimalList.stream().collect(Collectors.averagingDouble(BigDecimal::doubleValue)));
+        speedAndDensityDto.setWindSpeed(avgWindSpeed);
+        Map<String, ProphaseWeatherData> prophaseWeatherDataMap = weatherData.stream().collect(Collectors.toMap(x -> x.getTs().getTime() + "", x -> x, (x1, x2) -> x1));
+        if (null != prophaseWeatherDataMap) {
+            speedAndDensityDto.setWindPowerDensity(CalculationUtil.windEnergyDensity(anemometryData, prophaseWeatherDataMap));
+        } else {
+            log.error("获取风况数据错误,未查询到环境数据,时间点:{}", anemometryData.get(0).getTs());
+        }
+        return speedAndDensityDto;
+    }
+
+
+}

+ 6 - 5
wrdep-biz/src/main/java/com/jiayue/biz/service/impl/AnalysisDataImpl.java

@@ -1249,6 +1249,7 @@ public class AnalysisDataImpl {
 
     }
 
+
     /**
      * dat文件解析
      */
@@ -1305,7 +1306,7 @@ public class AnalysisDataImpl {
 
     }
 
-    public List<Map<String, Object>> parseByHead(List<CsvRow> rows, CsvRow rowsOne) {
+    public static List<Map<String, Object>> parseByHead(List<CsvRow> rows, CsvRow rowsOne) {
         List<Map<String, Object>> mapList = new ArrayList<>();
         for (int i = 4; i < rows.size(); i++) {
             HashMap<String, Object> hashMap = new HashMap<>();
@@ -1321,7 +1322,7 @@ public class AnalysisDataImpl {
     }
 
 
-    public String getWsOrWdOrTOrRhOrPa(String attribute, StringBuilder wsHeight, StringBuilder wdHeight, int i, CsvRow rowsF, WindTowerInfo windTowerInfo) {
+    public static String getWsOrWdOrTOrRhOrPa(String attribute, StringBuilder wsHeight, StringBuilder wdHeight, int i, CsvRow rowsF, WindTowerInfo windTowerInfo) {
         String str = "";
         String height = "";
         String avgOrStaOrMaxOrMin = getAvgOrStaOrMaxOrMin(attribute);
@@ -1351,7 +1352,7 @@ public class AnalysisDataImpl {
             str = "t";
         } else if (attribute.contains("RH")) {
             str = "rh";
-        } else if (attribute.contains("pa")) {
+        } else if (attribute.contains("pa") || attribute.contains("Pa")) {
             str = "pa";
         } else if (attribute.contains("Station")) {
             windTowerInfo.setEquipmentNo(rowsF.get(i));
@@ -1365,13 +1366,13 @@ public class AnalysisDataImpl {
         return str + avgOrStaOrMaxOrMin;
     }
 
-    public String getAvgOrStaOrMaxOrMin(String attribute) {
+    public static String getAvgOrStaOrMaxOrMin(String attribute) {
         String str = "";
         if (attribute.contains("Batt") || attribute.contains("Minute")) {
             return str;
         }
         if (attribute.contains("Avg")) {
-            str = "Avg";
+            str = "Ave";
         } else if (attribute.contains("Std")) {
             str = "Sta";
         } else if (attribute.contains("Max")) {

+ 32 - 85
wrdep-biz/src/main/java/com/jiayue/biz/service/impl/DataRecalculationImpl.java

@@ -2,16 +2,14 @@ package com.jiayue.biz.service.impl;
 
 
 import cn.hutool.core.util.ZipUtil;
+import cn.hutool.json.JSONUtil;
 import cn.hutool.poi.excel.ExcelReader;
 import cn.hutool.poi.excel.ExcelUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jiayue.biz.domain.*;
 import com.jiayue.biz.mapper.ProphaseAnemometryDataMapper;
 import com.jiayue.biz.mapper.ProphaseWeatherDataMapper;
-import com.jiayue.biz.service.DataRecalculationService;
-import com.jiayue.biz.service.EquipmentAttributeService;
-import com.jiayue.biz.service.ProphaseWeatherDataService;
-import com.jiayue.biz.service.WindTowerDataChildTableService;
+import com.jiayue.biz.service.*;
 import com.jiayue.biz.util.DateTimeUtil;
 import com.jiayue.biz.util.FileUtil;
 import com.jiayue.common.core.domain.AjaxResult;
@@ -58,7 +56,8 @@ public class DataRecalculationImpl implements DataRecalculationService {
 
     private final ProphaseWeatherDataService prophaseWeatherDataService;
     private final ProphaseAnemometryDataMapper prophaseAnemometryDataMapper;
-
+    private final WindDataCalculation2Service windDataCalculation2Service;
+    private final WindTowerCalculationDataServiceImpl windTowerCalculationDataServiceImpl;
 
     public void teset() {
 //    File file1 = MultipartFileToFile(file);
@@ -602,12 +601,16 @@ public class DataRecalculationImpl implements DataRecalculationService {
 
     public AjaxResult statisticsCheck(Date startTime, Date endTime, String equipmentNo) {
         try {
+            log.info("开始重新计算统计数据:startTime-{};endTime-{};equipmentNo-{};", endTime, endTime, equipmentNo);
             //获取到结束时间的当天最后时间
             endTime = DateTimeUtil.getDayLastTime(endTime.getTime());
-            List<StatisticsSituation> statisticsSituations = statisticsSituationService.list();
-            List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
-            List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startTime, endTime, equipmentNo);
             List<WindTowerInfo> windTowerInfoList = windTowerInfoService.getByEquipmentNo(equipmentNo);
+            WindTowerInfo windTowerInfo = null;
+            if (null != windTowerInfoList && null != windTowerInfoList.get(0)) {
+                windTowerInfo = windTowerInfoList.get(0);
+            } else {
+                return AjaxResult.error("测风塔信息查询异常:{}", JSONUtil.toJsonStr(windTowerInfoList));
+            }
             //风数据查询
             List<ProphaseAnemometryData> prophaseAnemometryDataList = prophaseAnemometryDataMapper.selectList(Wrappers.<ProphaseAnemometryData>lambdaQuery()
                     .eq(ProphaseAnemometryData::getEquipmentId, equipmentNo)
@@ -615,88 +618,32 @@ public class DataRecalculationImpl implements DataRecalculationService {
                     .ge(ProphaseAnemometryData::getTs, new Timestamp(startTime.getTime())));
             //环境数据查询
             List<ProphaseWeatherData> prophaseWeatherDataList = prophaseWeatherDataService.selectPublicData(equipmentNo, new Timestamp(startTime.getTime()), new Timestamp(endTime.getTime()));
-            //把传入的时间按照日或月分割
-            log.info("开始重新计算统计数据");
-            ArrayList<WindTowerCalculationData> allDataList = new ArrayList<>();
-//            //小时风功率密度和平均风速
-            ArrayList<WindTowerCalculationData> dataList = windTowerCalculationDataService.calculateWindPowerDensity(startTime.getTime(), endTime.getTime(), equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
-            allDataList.addAll(dataList);
-//            //小时风切变
-            ArrayList<WindTowerCalculationData> calculationData = windTowerCalculationDataService.calculateWindPowerShear(startTime, endTime, equipmentNo, prophaseAnemometryDataList, windTowerCalculationDataList);
-            allDataList.addAll(calculationData);
-//            //日平均温度
-            ArrayList<WindTowerCalculationData> tDay = windTowerCalculationDataService.tDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
-            allDataList.addAll(tDay);
-//            //日平均气压
-            ArrayList<WindTowerCalculationData> paDay = windTowerCalculationDataService.paDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
-            allDataList.addAll(paDay);
-//            //发电量与满发小时数
-            ArrayList<WindTowerCalculationData> calculateBattery = windTowerCalculationDataService.calculateBattery(startTime.getTime(), endTime.getTime(), windTowerInfoList.get(0), prophaseAnemometryDataList, equipmentAttributeList, windTowerCalculationDataList);
-            allDataList.addAll(calculateBattery);
-//            //日平均风速
-            ArrayList<WindTowerCalculationData> wsDay = windTowerCalculationDataService.wsDay(startTime, endTime, equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-            allDataList.addAll(wsDay);
-//            //日平均风速标差
-            ArrayList<WindTowerCalculationData> calculationData1 = windTowerCalculationDataService.calculateStaDay(startTime, endTime, equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
-            allDataList.addAll(calculationData1);
-//            //日平均湍流
-            ArrayList<WindTowerCalculationData> turbulenceDay = windTowerCalculationDataService.turbulenceDay(startTime, endTime, equipmentNo, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
-            allDataList.addAll(turbulenceDay);
-//            //日平均空气密度
-            ArrayList<WindTowerCalculationData> airDensityDay = windTowerCalculationDataService.airDensityDay(startTime, endTime, equipmentNo, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
-            allDataList.addAll(airDensityDay);
-//            //日平均风功率密度
-            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, prophaseAnemometryDataList);
-            allDataList.addAll(shearDay);
-            //15m/s湍流
-            ArrayList<WindTowerCalculationData> turForWsByFifteenDayList = windTowerCalculationDataService.turForWsByFifteenDay(startTime, endTime, equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-            allDataList.addAll(turForWsByFifteenDayList);
-
-            List<Long> dateTime = DateTimeUtil.getIntervalTimeByMonth(DateTimeUtil.beginOfMonth(startTime), DateTimeUtil.beginOfMonth(endTime));
-            for (Long l : dateTime) {
-//                //月平均风速
-                ArrayList<WindTowerCalculationData> wsMonth = windTowerCalculationDataService.wsMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(wsMonth);
-//                //月平均风功率密度
-                ArrayList<WindTowerCalculationData> wpdMonth = windTowerCalculationDataService.wpdMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(wpdMonth);
-                //月平均湍流
-                ArrayList<WindTowerCalculationData> turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(turbulenceMonth);
-//                //月平均空气密度
-                ArrayList<WindTowerCalculationData> airDensityMonth = windTowerCalculationDataService.airDensityMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, windTowerCalculationDataList, equipmentAttributeList);
-                allDataList.addAll(airDensityMonth);
-//                //月最大风速
-                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, prophaseAnemometryDataList);
-                allDataList.addAll(shearMonth);
-//                //月平均风速标差
-                ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(staMonth);
-                //月玫瑰图
-                windDirectionStatisticsDataService.roseMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList);
-//                //月平均环境数据
-                ArrayList<WindTowerCalculationData> environmentData = windTowerCalculationDataService.environmentData(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), equipmentNo, prophaseWeatherDataList, equipmentAttributeList);
-                allDataList.addAll(environmentData);
-//                //空气密度月逐时
-                ArrayList<WindTowerCalculationData> airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(equipmentNo, DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseWeatherDataList);
-                allDataList.addAll(airDensityMonth1);
-//                //湍流月逐时
-                ArrayList<WindTowerCalculationData> turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(equipmentNo, DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
-                allDataList.addAll(turbulenceHourForMonth);
+
+            log.info("重算数据查询完成- prophaseWeatherDataList:{};prophaseAnemometryDataList:{}", prophaseWeatherDataList.size(), prophaseAnemometryDataList.size());
+            if (0 == prophaseWeatherDataList.size() || 0 == prophaseAnemometryDataList.size()) {
+                log.error("未查询到计算需要的数据");
+                return AjaxResult.error("未查询到计算需要的数据");
             }
+
+            List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
+            List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startTime, endTime, equipmentNo);
+
+            ArrayList<WindTowerCalculationData> allDataList = new ArrayList<>();
+            Map<String, EquipmentAttribute> equipmentAttributeMap = equipmentAttributeList.stream().collect(Collectors.toMap(x -> x.getFieldName() + "", x -> x, (x1, x2) -> x1));
+            allDataList = windDataCalculation2Service.calcu(allDataList, startTime, endTime, equipmentNo, prophaseAnemometryDataList
+                    , prophaseWeatherDataList, equipmentAttributeMap, windTowerCalculationDataList, windTowerInfo);
+            log.info("数据计算完成,开始保存:{}", allDataList.size());
             // 统计概述
-            statisticsSituationService.statisticsSituation(windTowerInfoList.get(0), statisticsSituations, equipmentAttributeList);
+            List<StatisticsSituation> statisticsSituations = statisticsSituationService.list();
+            statisticsSituationService.statisticsSituation(windTowerInfo, statisticsSituations, equipmentAttributeList);
+
+            //删除时间段所有数据后保存新数据
+            windTowerCalculationDataServiceImpl.removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentNo, "");
             windTowerCalculationDataService.saveBatchByEquipmentId(allDataList, equipmentNo);
-            log.info("计算统计数据执行完毕");
+            log.info("计算统计数据保存执行完毕");
             return AjaxResult.success("数据已经重新统计");
         } catch (Exception e) {
-            log.info("数据统计计算时异常:{}",e);
+            log.info("数据统计计算时异常:{}", e);
             return AjaxResult.error("数据统计计算时异常");
         }
     }

+ 4 - 6
wrdep-biz/src/main/java/com/jiayue/biz/service/impl/EmailImpl.java

@@ -11,6 +11,7 @@ import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 import javax.mail.internet.MimeUtility;
+import javax.mail.search.*;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.biz.domain.Email;
@@ -111,12 +112,10 @@ public class EmailImpl extends ServiceImpl<EmailMapper, Email> implements EmailS
                 // 获得收件箱中的未读邮件数
                 log.warn("未读邮件数: {}", folder.getUnreadMessageCount());
                 log.warn("总邮件个数: {}", folder.getMessageCount());
-                Message[] messages1 = folder.getMessages();
+                FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false); //false代表未读,true代表已读
+                Message[] messages1 = folder.search(ft);
+
                 for (Message message : messages1) {
-                    //存在附件返回true 不存在返回false
-                    Flags flags = message.getFlags();
-                    if (flags.contains(Flags.Flag.SEEN)) {
-                    } else {
                         //未读
                         Multipart m = (Multipart) message.getContent();
                         for (int s = 0; s < m.getCount(); s++) {
@@ -125,7 +124,6 @@ public class EmailImpl extends ServiceImpl<EmailMapper, Email> implements EmailS
                         }
                         //解析邮件
                         parseMessage(message);
-                    }
                 }
 
                 //得到收件箱中的所有邮件并且删除邮件

+ 31 - 64
wrdep-biz/src/main/java/com/jiayue/biz/service/impl/HomePageServiceImpl.java

@@ -14,6 +14,7 @@ import com.jiayue.biz.mapper.WindTowerDataParentTableMapper;
 import com.jiayue.biz.service.*;
 import com.jiayue.biz.util.CalculationUtil;
 import com.jiayue.biz.util.DateTimeUtil;
+import com.jiayue.common.core.text.Convert;
 import com.jiayue.common.utils.DateUtil;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -96,6 +97,14 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
         ArrayList<String> heightList = new ArrayList<>();
         //循环层高
         for (String height : heights) {
+            //毛武平 在2024年5月7日提出修改需求,项目2 相关的声雷达数据,首页满发小时数据显示100米层高计算结果
+            String xiangmu2WindTower = "202101034,202101047,202101055,202301008,202301016,202101029,202101009";
+            if(xiangmu2WindTower.contains(equipmentId)){
+               int heightTemp = Convert.toInt(height);
+               if(heightTemp>130){
+                   continue;
+               }
+            }
             //获取风速风功率的统计id
             List<EquipmentAttribute> equipmentAttributeWpd = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "wpdMonth")).collect(Collectors.toList());
             List<EquipmentAttribute> equipmentAttributeWs = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "awsMonth")).collect(Collectors.toList());
@@ -148,7 +157,7 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
         Map<String, Long> startAndEnd = prophaseWeatherDataService.getDataTimeStartAndEnd(equipmentId);
 
         if (beginTime.getTime() < startAndEnd.get("startTime")) {
-            beginTime = new Date(startAndEnd.get("startTime"));
+            beginTime = DateUtil.parse(DateUtil.format(new Date(startAndEnd.get("startTime")),"yyyy-MM-dd 00:00:00"));
         }
         Date endTime = lastDataCalculation.getTime();
 
@@ -160,6 +169,14 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
         ArrayList<String> timeList = new ArrayList();
         boolean type = true;
         for (String height : heights) {
+            //毛武平 在2024年5月7日提出修改需求,项目2 相关的声雷达数据,首页满发小时数据显示100米层高计算结果
+            String xiangmu2WindTower = "202101034,202101047,202101055,202301008,202301016,202101029,202101009";
+            if(xiangmu2WindTower.contains(equipmentId)){
+                int heightTemp = Convert.toInt(height);
+                if(heightTemp>130){
+                    continue;
+                }
+            }
             List<EquipmentAttribute> equipmentAttributes = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "awsDay")).collect(Collectors.toList());
 
             ArrayList<Object> hList = new ArrayList();
@@ -183,50 +200,6 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
         everyMap.put("chart", everyData);
         everyMap.put("time", timeList);
 
-//        List<ProphaseAnemometryData> mapList = new ArrayList<>();
-//        if (!month.equals("")) {
-//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
-//            try {
-//                Date startDate = sdf.parse(month);
-//                Date endDate = DateTimeUtil.endOfMonth(startDate);
-//                mapList = prophaseAnemometryDataService.selectWsAve(equipmentId, new Timestamp(startDate.getTime()), new Timestamp(endDate.getTime()));
-//            } catch (ParseException e) {
-//                e.printStackTrace();
-//            }
-//        } else {
-//            // 最新一天数据
-//            List<Entity> lastData = prophaseWeatherDataService.getLastData(equipmentId);
-//            Timestamp timeEnd = (Timestamp) lastData.get(0).get("last (ts)");
-//            DateTime startTime = DateUtil.beginOfDay(new Date(timeEnd.getTime()));
-//            mapList = prophaseAnemometryDataService.selectWsAve(equipmentId, new Timestamp(startTime.getTime()), timeEnd);
-//
-//        }
-////        HashMap<String, Object> everyMap = new HashMap();
-//        //获取风速层高
-//        List<WindTowerInfo> windTowerInfos = windTowerInfoService.getByEquipmentNo(equipmentId);
-//        String height = windTowerInfos.get(0).getHeights();
-//        String[] heightAll = height.split(",");
-//
-//        // 时间list
-////        ArrayList<String> timeList = new ArrayList();
-////        ArrayList<Object> everyData = new ArrayList<>();
-//
-//        for (String h : heightAll) {
-//            timeList = new ArrayList();
-//            ArrayList<Object> hList = new ArrayList();
-//            HashMap<String, Object> hMap = new HashMap();
-//            //根据层高过滤时间和风速
-//            TreeMap<Long, Float> heightForTimeAndWs = new TreeMap<>(mapList.stream().filter(p -> p.getLayerHeight().equals(h))
-//                    .collect(Collectors.toMap(prophaseAnemometryData -> prophaseAnemometryData != null ? prophaseAnemometryData.getTs().getTime() : null, prophaseAnemometryData1 -> prophaseAnemometryData1 != null ? prophaseAnemometryData1.getWsAve() : null)));
-//            for (Map.Entry<Long, Float> entry : heightForTimeAndWs.entrySet()) {
-//                String time = DateUtil.format(new Date(entry.getKey()), "yyyy-MM-dd HH:mm:ss");
-//                timeList.add(time);
-//                hList.add(entry.getValue());
-//            }
-//            hMap.put("height", h);
-//            hMap.put("value", hList);
-//            everyData.add(hMap);
-//        }
 
 
         return everyMap;
@@ -275,22 +248,6 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
                     StatisticsSituation statisticsSituation = statisticsSituations.get(0);
                     String[] split = statisticsSituation.getStartTimeAndEndTime().split(",");
                     info = info + "数据起止时间:" + sdf.format(new Date(Long.parseLong(split[0]))) + " - " + sdf.format(new Date(Long.parseLong(split[1])));
-//                    if (statisticsSituation.getWsAve140() != null)
-//                        info = info + ";140米风速:" + statisticsSituation.getWsAve140().setScale(2, RoundingMode.HALF_UP);
-//                    if (statisticsSituation.getWsAve120() != null)
-//                        info = info + ";120米风速:" + statisticsSituation.getWsAve120().setScale(2, RoundingMode.HALF_UP);
-//                    if (statisticsSituation.getWsAve100() != null)
-//                        info = info + ";100米风速:" + statisticsSituation.getWsAve100().setScale(2, RoundingMode.HALF_UP);
-//                    if (statisticsSituation.getWsAve80() != null)
-//                        info = info + ";80米风速:" + statisticsSituation.getWsAve80().setScale(2, RoundingMode.HALF_UP);
-//                    if (statisticsSituation.getWsAve70() != null)
-//                        info = info + ";70米风速:" + statisticsSituation.getWsAve70().setScale(2, RoundingMode.HALF_UP);
-//                    if (statisticsSituation.getWsAve50() != null)
-//                        info = info + ";50米风速:" + statisticsSituation.getWsAve50().setScale(2, RoundingMode.HALF_UP);
-//                    if (statisticsSituation.getWsAve30() != null)
-//                        info = info + ";30米风速:" + statisticsSituation.getWsAve30().setScale(2, RoundingMode.HALF_UP);
-//                    if (statisticsSituation.getWsAve10() != null)
-//                        info = info + ";10米风速:" + statisticsSituation.getWsAve10().setScale(2, RoundingMode.HALF_UP);
                 }
                 if (!maps.isEmpty()) {
                     defectCount = new BigDecimal(maps.get(0).get("num").toString()).subtract(new BigDecimal(144));
@@ -448,7 +405,7 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
             DateTime startTime = DateUtil.beginOfDay(DateTimeUtil.getYearDay(timeEnd.getTime()));
             anemometryData = prophaseAnemometryDataService.selectWdAveAndWdAveAndWsStaForHeight(equipmentId, new Timestamp(startTime.getTime()), timeEnd, height);
         }
-
+        anemometryData = anemometryData.stream().filter(p -> null != p.getWsAve() && p.getWsAve() > 0 && p.getWsAve() < 30).collect(Collectors.toList());
         HashMap<String, Integer> hashMap = new HashMap<>();
 
         Map<String, BigDecimal> map = new HashMap<>();
@@ -499,11 +456,20 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
     public Map<String, Object> getAirAndPaAndT(String equipmentId, String month) {
         List<WindTowerInfo> windTowerInfoList = windTowerInfoService.getByEquipmentNo(equipmentId);
         String[] wdHeight = windTowerInfoList.get(0).getWdHeights().split(",");
+        String wdHeightMax = wdHeight[0];
 
         ArrayList<String> arrayList = new ArrayList(Arrays.asList(windTowerInfoList.get(0).getHeights().split(",")));
         //层高排序
         List<Integer> heightList = arrayList.stream().map(s -> Integer.parseInt(CalculationUtil.getNumberFromString(s))).sorted().collect(Collectors.toList());
         Integer maxHeight = heightList.get(heightList.size() - 1);
+        //毛武平 在2024年5月7日提出修改需求,项目2 相关的声雷达数据,首页满发小时数据显示100米层高计算结果
+        String xiangmu2WindTower = "202101034,202101047,202101055,202301008,202301016,202101029,202101009";
+        if(xiangmu2WindTower.contains(equipmentId)){
+            wdHeightMax="100";
+            maxHeight =100;
+        }
+
+
         //获取最后一条记录
         WindTowerCalculationData lastDataCalculation = windTowerCalculationDataService.getLastDataCalculation(equipmentId);
 
@@ -515,7 +481,7 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
         List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, "airDensityMonth").or().eq(EquipmentAttribute::getFieldName, "tAVE").or().
                 eq(EquipmentAttribute::getFieldName, "paAVE").or().eq(EquipmentAttribute::getFieldName, maxHeight + "turbulenceMonth").or().
                 eq(EquipmentAttribute::getFieldName, "windShearMonth").or().eq(EquipmentAttribute::getFieldName, "batteryDay")
-                .or().eq(EquipmentAttribute::getFieldName, wdHeight[0] + "monthWdRose").list();
+                .or().eq(EquipmentAttribute::getFieldName, wdHeightMax + "monthWdRose").list();
 
         List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentIdAndEbId(beginTime, endTime, equipmentId, equipmentAttributeList);
 
@@ -541,7 +507,8 @@ public class HomePageServiceImpl extends ServiceImpl<WindTowerDataParentTableMap
         //满发小时数
         dataMap.put("hour", hourMax);
 
-        List<EquipmentAttribute> equipmentAttributes = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(wdHeight[0] + "monthWdRose")).collect(Collectors.toList());
+        String finalWdHeightMax = wdHeightMax;
+        List<EquipmentAttribute> equipmentAttributes = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(finalWdHeightMax + "monthWdRose")).collect(Collectors.toList());
         List<WindDirectionStatisticsData> windDirectionStatisticsDataList = windDirectionStatisticsDataService.lambdaQuery().eq(WindDirectionStatisticsData::getEbId, equipmentAttributes.get(0).getId()).between(WindDirectionStatisticsData::getTime, beginTime, endTime)
                 .eq(WindDirectionStatisticsData::getEquipmentId, equipmentId).list();
 

+ 29 - 3
wrdep-biz/src/main/java/com/jiayue/biz/util/CalculationUtil.java

@@ -46,9 +46,9 @@ public class CalculationUtil {
         List<ProphaseAnemometryData> collect = new ArrayList<>();
         if (windEnum.name().equals("N")) {
             // N的范围为 348.75<wd<360 + 0<wd<11.25
-            collect = List.stream().filter(e -> e.getWdAve() != null).filter(w -> (getBigDecimal(w.getWdAve()).compareTo(windEnum.getLower()) >= 0 && getBigDecimal(w.getWdAve()).compareTo(new BigDecimal(360)) <= 0) || (getBigDecimal(w.getWdAve()).compareTo(windEnum.getUpper()) < 0 && getBigDecimal(w.getWdAve()).compareTo(new BigDecimal(0)) > 0)).collect(Collectors.toList());
+            collect = List.stream().filter(e -> e.getWdAve() != null && e.getWdAve() != -99).filter(w -> (getBigDecimal(w.getWdAve()).compareTo(windEnum.getLower()) >= 0 && getBigDecimal(w.getWdAve()).compareTo(new BigDecimal(360)) <= 0) || (getBigDecimal(w.getWdAve()).compareTo(windEnum.getUpper()) < 0 && getBigDecimal(w.getWdAve()).compareTo(new BigDecimal(0)) > 0)).collect(Collectors.toList());
         } else {
-            collect = List.stream().filter(w -> w.getWdAve() != null && getBigDecimal(w.getWdAve()).compareTo(windEnum.getLower()) >= 0 && getBigDecimal(w.getWdAve()).compareTo(windEnum.getUpper()) < 0).collect(Collectors.toList());
+            collect = List.stream().filter(w -> w.getWdAve() != null && w.getWdAve() != -99 && getBigDecimal(w.getWdAve()).compareTo(windEnum.getLower()) >= 0 && getBigDecimal(w.getWdAve()).compareTo(windEnum.getUpper()) < 0).collect(Collectors.toList());
         }
         return collect;
     }
@@ -75,7 +75,7 @@ public class CalculationUtil {
      * @return
      */
     public static BigDecimal getAvgWind(List<BigDecimal> bigDecimalList) {
-        return new BigDecimal(bigDecimalList.stream().collect(Collectors.averagingDouble(BigDecimal::doubleValue))).setScale(2, RoundingMode.HALF_UP);
+        return new BigDecimal(bigDecimalList.stream().filter(bigDecimal -> bigDecimal.doubleValue()>0).collect(Collectors.averagingDouble(BigDecimal::doubleValue))).setScale(2, RoundingMode.HALF_UP);
     }
 
 
@@ -105,6 +105,32 @@ public class CalculationUtil {
         }
     }
 
+    /**
+     * 计算风能密度(风功率玫瑰图)
+     *
+     * @return 风能密度
+     */
+    public static BigDecimal windEnergyDensity(List<ProphaseAnemometryData> anemometryData, Map<String, ProphaseWeatherData> prophaseWeatherDataMap) {
+
+        BigDecimal density = new BigDecimal(-99);
+        try {
+            if (anemometryData.size() != 0) {
+                BigDecimal wpdSum = new BigDecimal(0);
+                for (ProphaseAnemometryData anemometryDatum : anemometryData) {
+                    ProphaseWeatherData prophaseWeatherData = prophaseWeatherDataMap.get(anemometryDatum.getTs().getTime() + "");
+
+                    if (null != prophaseWeatherData) {
+                        wpdSum = wpdSum.add(getWpdCalculate(getBigDecimal(prophaseWeatherData.getAirDensity()), getBigDecimal(anemometryDatum.getWsAve())));
+                    }
+                }
+                density = wpdSum.divide(BigDecimal.valueOf(anemometryData.size()), 2, RoundingMode.HALF_UP);
+            }
+        } catch (Exception e) {
+            log.error("计算风风能密度时发生错误:{}", e);
+        } finally {
+            return density;
+        }
+    }
     //计算风功率密度公式
     public static BigDecimal getWpdCalculate(BigDecimal airAve, BigDecimal wsAve) {
         return airAve.multiply(power(getBigDecimal(wsAve), 3)).multiply(BigDecimal.valueOf(0.5));

+ 49 - 0
wrdep-biz/src/main/java/com/jiayue/biz/util/DateTimeUtil.java

@@ -338,4 +338,53 @@ public class DateTimeUtil {
 //        dateList.remove(dateList.size() - 1);
         return dateList;
     }
+
+
+    /**
+     * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm
+     *
+     * @param dateDate
+     * @return
+     */
+    public static String getFormatDateStrForHH(Long dateDate) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH");
+        String dateString = formatter.format(dateDate);
+        return dateString;
+    }
+
+    /**
+     * 将长时间格式时间转换为字符串 yyyy-MM-dd
+     *
+     * @param dateDate
+     * @return
+     */
+    public static String getFormatDateStrForMonth(Long dateDate) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
+        String dateString = formatter.format(dateDate);
+        return dateString;
+    }
+
+    /**
+     * 将长时间格式时间转换为字符串 yyyy-MM-dd
+     *
+     * @param dateDate
+     * @return
+     */
+    public static String getFormatDateStrForDay(Long dateDate) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String dateString = formatter.format(dateDate);
+        return dateString;
+    }
+
+    /**
+     * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm
+     *
+     * @param dateDate
+     * @return
+     */
+    public static String getFormatDateStrForHour(Long dateDate) {
+        SimpleDateFormat formatter = new SimpleDateFormat("HH");
+        String dateString = formatter.format(dateDate);
+        return dateString;
+    }
 }

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

@@ -4,12 +4,22 @@ spring:
     multipart:
       max-file-size: 512MB
       max-request-size: 512MB
+  #  data:
+  #    mongodb:
+  ##      host: 49.4.78.194
+  ##      host: 10.124.252.246
+  #      host: 192.168.10.208
+  ##      port: 17142
+  #      port: 27017
+  #      database: neim
+  #      username: neimdb
+  #      password: 'neim123'
   datasource:
     dynamic:
       primary: mysql #设置默认的数据源或者数据源组,默认值即为master
       datasource:
         mysql:
-          url: jdbc:mysql://192.168.1.205:3306/wrdep_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          url: jdbc:mysql://127.0.0.1:3306/wrdep_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
           username: root
           password: '!QAZ2root'
           driver-class-name: com.mysql.cj.jdbc.Driver
@@ -56,10 +66,10 @@ spring:
                 config:
                   multi-statement-allow: true
         tdengine:
-          url: jdbc:TAOS://192.168.1.114:6030/nerp_db
+          url: jdbc:TAOS://127.0.0.1:6030/wrdep_db
           username: root
-          password: 123456
-          #password: "!QAZ2root"
+          #          password: 123456
+          password: "!QAZ2root"
           driver-class-name: com.taosdata.jdbc.TSDBDriver
           type: com.alibaba.druid.pool.DruidDataSource
           druid:
@@ -69,9 +79,10 @@ spring:
   # redis 配置
   redis:
     # 地址
-    host: 192.168.1.205
+    host: 127.0.0.1
     port: 6379
-    database: 7
+    # 数据库索引
+    database: 0
     # 密码
     password: jiayue
     # 连接超时时间

+ 2 - 2
wrdep-biz/src/main/resources/application-prod.yml

@@ -19,7 +19,7 @@ spring:
       primary: mysql #设置默认的数据源或者数据源组,默认值即为master
       datasource:
         mysql:
-          url: jdbc:mysql://127.0.0.1:3306/wrdep_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+          url: jdbc:mysql://localhost:3306/wrdep_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
           username: root
           password: '!QAZ2root'
           driver-class-name: com.mysql.cj.jdbc.Driver
@@ -66,7 +66,7 @@ spring:
                 config:
                   multi-statement-allow: true
         tdengine:
-          url: jdbc:TAOS://127.0.0.1:6030/nerp_db
+          url: jdbc:TAOS://localhost:6030/nerp_db
           username: root
           #          password: 123456
           password: "!QAZ2root"

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
wrdep-biz/src/main/resources/templates/index.html


+ 1 - 1
wrdep-ui/package.json

@@ -5,7 +5,7 @@
   "author": "jiayuepowertech",
   "license": "MIT",
   "scripts": {
-    "dev": "vue-cli-service serve",
+    "dev": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
     "build:prod": "vue-cli-service build",
     "build:stage": "vue-cli-service build --mode staging",
     "preview": "node build/index.js --preview",

+ 1 - 14
wrdep-ui/src/views/largeScreenPage/Subpage/emailResourcesInfo.vue

@@ -195,7 +195,7 @@
             <!--  标题-->
             <div class="rightTiltleTextBg">
               <div class="tiltle">
-                <span class="mainTitle">风能玫瑰图</span>
+                <span class="mainTitle">风能玫瑰图1</span>
               </div>
             </div>
             <!-- 内容  -->
@@ -270,19 +270,6 @@ export default {
     getProjectSelect() {
       projectSelect().then(res => {
         this.projectOption = res.data
-        // if (this.emailWindTowerInfo !== undefined) {
-        //   this.projectId = this.emailWindTowerInfo.projectId
-        //   let project = this.projectOption.find(w => w.value === this.projectId)
-        //   this.towerOption = project.equipmentDto
-        //   if (this.emailWindTowerInfo.equipmentNo !== null && this.emailWindTowerInfo.equipmentNo !== undefined) {
-        //     this.cftNo = this.emailWindTowerInfo.equipmentNo
-        //     let towerInfo = this.towerOption.find(w => w.value === this.cftNo)
-        //     this.wdHeight = towerInfo.wdHeight
-        //   } else {
-        //     this.cftNo = this.towerOption[0].value
-        //     this.wdHeight = this.towerOption[0].wdHeight
-        //   }
-        // } else {
           this.projectId = this.projectOption[0].value
           this.towerOption = this.projectOption[0].equipmentDto
           this.cftNo = this.towerOption[0].value

+ 13 - 11
wrdep-ui/src/views/largeScreenPage/components/wdCharts.vue

@@ -45,7 +45,7 @@ export default {
       handler(value) {
         clearInterval(this.timer)
         this.timer = null
-        // console.log(value)
+        console.log(value)
         this.equipmentNo = value.equipmentNo
         this.wdHeights = value.wdHeights
         // 获取测风塔编号
@@ -240,17 +240,19 @@ export default {
               }
             }
           } else {
-            arr = {
-              number: [parseInt(str[i])],
-              content: '{nt}',
-              textAlign: 'center',
-              style: {
-                fontFamily:'timeFont',
-                fill:'rgb(17,241,134)',
-                // gradientParams:['#9CF472','0%','#fff','99.12109375%'],
-                // gradientType:'linear'
+            if(parseInt(str[i])<=130 ){
+              arr = {
+                number: [parseInt(str[i])],
+                content: '{nt}',
+                textAlign: 'center',
+                style: {
+                  fontFamily:'timeFont',
+                  fill:'rgb(17,241,134)',
+                  // gradientParams:['#9CF472','0%','#fff','99.12109375%'],
+                  // gradientType:'linear'
+                }
               }
-            }
+            }else{continue}
           }
           configArr.push(arr)
         }

+ 24 - 11
wrdep-ui/src/views/largeScreenPage/components/wdPowerCharts.vue

@@ -34,9 +34,10 @@ export default {
         // console.log(value)
         this.equipmentNo = value.equipmentNo
         this.wdHeights = value.wdHeights
+
         // 获取测风塔编号
-        if (this.getConfig(value.wdHeights)) {
-          this.getWdData(value.equipmentNo, '')
+        if (this.getConfig(this.wdHeights)) {
+          this.getWdData(this.equipmentNo, '')
           var _self = this
           this.timer = setInterval(function () {
             _self.getWdData(_self.equipmentNo, '')
@@ -99,6 +100,14 @@ export default {
         } else {
           height = this.config.number[0]
         }
+        let xiangmu2WindTower = "202101034,202101047,202101055,202301008,202301016,202101029,202101009"
+        if(xiangmu2WindTower.includes( cftNo)){
+          if(Number(height)>130){
+            height="130";
+          }
+        }
+        console.log("====================")
+        console.log(height)
         getRoseChats({equipmentId: cftNo, height: height, month: month}).then(res => {
           // console.log(res.data)
           let windPowerEchartsData = res.data.windPowerEchars
@@ -192,16 +201,20 @@ export default {
               style: {fontSize: 25, fontFamily:'timeFont', fill:'rgb(17,241,134)',}
             }
           } else {
-            arr = {
-              number: [parseInt(str[i])],
-              content: '{nt}',
-              textAlign: 'center',
-              style: {
-                fontSize: 25,
-                fontFamily:'timeFont',
-                fill:'rgb(17,241,134)',
+            //毛武平 在2024年5月7日提出修改需求,项目2 相关的声雷达数据,首页数据显示130米层高以内的数据
+            if(parseInt(str[i])<=130 ){
+              arr = {
+                number: [parseInt(str[i])],
+                content: '{nt}',
+                textAlign: 'center',
+                style: {
+                  fontSize: 25,
+                  fontFamily:'timeFont',
+                  fill:'rgb(17,241,134)',
+                }
               }
-            }
+            }else {continue}
+
           }
           configArr.push(arr)
         }

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác