PdfServiceImpl.java 90 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568
  1. package com.jiayue.biz.service.impl;
  2. import cn.hutool.core.date.DateTime;
  3. import cn.hutool.db.Entity;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.jiayue.biz.domain.*;
  6. import com.jiayue.biz.eunms.WindDirectionEnum;
  7. import com.jiayue.biz.mapper.WindTowerDataParentTableMapper;
  8. import com.jiayue.biz.service.*;
  9. import com.jiayue.biz.util.CalculationUtil;
  10. import com.jiayue.biz.util.DateMomentUtil;
  11. import com.jiayue.biz.util.DateTimeUtil;
  12. import com.jiayue.common.utils.DateUtil;
  13. import flanagan.analysis.ProbabilityPlot;
  14. import lombok.AllArgsConstructor;
  15. import org.apache.commons.lang3.time.DateUtils;
  16. import org.springframework.stereotype.Service;
  17. import java.math.BigDecimal;
  18. import java.math.RoundingMode;
  19. import java.sql.Timestamp;
  20. import java.text.SimpleDateFormat;
  21. import java.util.*;
  22. import java.util.stream.Collectors;
  23. import java.util.stream.Stream;
  24. import static com.jiayue.biz.eunms.TimeDimension.month;
  25. /**
  26. * 首页Service业务层处理
  27. *
  28. * @author L.ym
  29. * @date 2022-05-11
  30. */
  31. @Service
  32. @AllArgsConstructor
  33. public class PdfServiceImpl extends ServiceImpl<WindTowerDataParentTableMapper, WindTowerDataParentTable> implements PdfService {
  34. private final WindTowerInfoServiceImpl windTowerInfoService;
  35. private final WindTowerCalculationDataServiceImpl windTowerCalculationDataService;
  36. private final EquipmentAttributeService equipmentAttributeService;
  37. private final RealTimeDisplayService realTimeDisplayService;
  38. private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataService;
  39. private final ProphaseAnemometryDataService prophaseAnemometryDataService;
  40. private final ProphaseWeatherDataService prophaseWeatherDataService;
  41. @Override
  42. public Map<String, Object> generatePDF(String equipmentId, String height, Date startDay, Date endDay) {
  43. //如果结束时间大于现在时间
  44. if (DateUtil.date().getTime() < endDay.getTime()) {
  45. //将结束时间设置为昨天结束时间
  46. endDay = DateUtil.endOfDay(DateUtil.yesterday());
  47. }
  48. Map<String, Object> map = new HashMap<>();
  49. SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  50. long realityCount = 0;//数据实际条数
  51. // 一年的计算数据
  52. startDay = DateUtil.beginOfMonth(startDay);
  53. endDay = DateUtil.endOfMonth(endDay);
  54. List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startDay, endDay, equipmentId);
  55. // 一年的风向统计数据
  56. List<WindDirectionStatisticsData> windDirectionStatisticsDataList = windDirectionStatisticsDataService.getByBetweenTimeAndEquipmentId(startDay, endDay, equipmentId);
  57. //所有类型数据
  58. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
  59. //所有测风塔信息
  60. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list();
  61. List<WindTowerInfo> windTowerInfos = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList());
  62. // List<WindTowerInfo> windTowerInfos = windTowerInfoService.getByEquipmentNo(equipmentId);
  63. //计算完整性
  64. List<Entity> entities = prophaseWeatherDataService.selectCount(equipmentId);
  65. for (Entity entity : entities) {
  66. //过滤非时间区间的数据累加;只要时间范围内的
  67. if(((Timestamp)entity.get("_wstart")).compareTo(startDay) > -1 && ((Timestamp)entity.get("_wstart")).compareTo(endDay) <=0){
  68. // td engine 取出的时间需要截取字段
  69. realityCount += (long) entity.get("count(*)");
  70. }
  71. }
  72. //测风塔信息概要
  73. Map<String, Object> windTowerInfo = getWindTowerInfo(windTowerCalculationDatas, equipmentAttributeList, windTowerInfos, height, realityCount, startDay, endDay);
  74. map.put("windTowerInfo", windTowerInfo);
  75. //测风塔统计概要概要
  76. Map<String, Object> statisticsData = statisticsWindTowerStatusData(windTowerCalculationDatas, equipmentAttributeList, windTowerInfos, realityCount, startDay, endDay);
  77. map.put("statisticsData", statisticsData);
  78. //风速和风功率密度时间曲线图 (时间序列)
  79. Map<String, Object> wsAndWpd = getWsAndWpd(windTowerCalculationDatas, equipmentAttributeList, height, startDay, endDay);
  80. map.put("wsAndWpd", wsAndWpd);
  81. //风速和风速标准差时间曲线图
  82. Map<String, Object> wsAndWsStaData = wsAndWsSta(windTowerCalculationDatas, equipmentAttributeList, height, startDay, endDay);
  83. map.put("wsAndWsStaData", wsAndWsStaData);
  84. //风速和风速密度日变化
  85. Map<String, Object> windPowerDensityAndAverageWindSpeed = getWindPowerDensityAndAverageWindSpeed(windTowerCalculationDatas, equipmentAttributeList, windTowerInfos, height);
  86. map.put("windPowerDensityAndAverageWindSpeed", windPowerDensityAndAverageWindSpeed);
  87. //风速和风速密度各月日变化
  88. List<Map<String, Object>> MonthWsAndWpd = getMonthWsAndWpd(windTowerCalculationDatas, equipmentAttributeList, height, startDay, endDay);
  89. map.put("MonthWsAndWpd", MonthWsAndWpd);
  90. //风速和风速密度年变化曲线
  91. Map<String, Object> yearWsAndWpd = getYearWsAndWpd(windTowerCalculationDatas, equipmentAttributeList, height, startDay, endDay);
  92. map.put("yearWsAndWpd", yearWsAndWpd);
  93. //风速和风速密度各月日变化表格
  94. Map<String, Object> monthWpdTable = getMonthWpdTable(windTowerCalculationDatas, equipmentAttributeList, windTowerInfos, startDay, endDay);
  95. map.put("monthWpdTable", monthWpdTable);
  96. //pdf威布尔
  97. Map<String, Object> weibull = pdfWeibull(equipmentAttributeList, equipmentId, windTowerCalculationDatas, height);
  98. map.put("weibull", weibull);
  99. //一年玫瑰图
  100. Map<String, Object> roseChart = roseCharts(windDirectionStatisticsDataList, equipmentAttributeList, height);
  101. map.put("roseChart", roseChart);
  102. //各月玫瑰图
  103. Map<String, Object> monthRoseCharts = getMonthRoseCharts(windDirectionStatisticsDataList, equipmentAttributeList, height);
  104. map.put("monthRoseCharts", monthRoseCharts);
  105. //空气密度
  106. Map<String, Object> airDensity = getAirDensity(windTowerCalculationDatas, equipmentAttributeList, startDay, endDay);
  107. map.put("airDensity", airDensity);
  108. //获取风切变指数(风向玫瑰图)
  109. List<Map<String, Object>> windShearRose = getWindShearRose(windDirectionStatisticsDataList, equipmentAttributeList, height);
  110. map.put("windShearRose", windShearRose);
  111. //风切变日/年变化
  112. Map<String, Object> windShear = getWindShear(windTowerCalculationDatas, equipmentAttributeList, height);
  113. map.put("windShear", windShear);
  114. //湍流曲线
  115. List<List<BigDecimal>> turIntensityCharts = getTurIntensityCharts(windTowerCalculationDatas, equipmentAttributeList, height);
  116. map.put("turIntensityCharts", turIntensityCharts);
  117. //湍流日/年变化
  118. Map<String, Object> turIntensity = getTurIntensity(windTowerCalculationDatas, equipmentAttributeList, height);
  119. map.put("turIntensity", turIntensity);
  120. //获取湍流(风向玫瑰图)
  121. Map<String, Object> turIntensityRose = getTurIntensityRose(windDirectionStatisticsDataList, equipmentAttributeList, windTowerInfos.get(0), height);
  122. map.put("turIntensityRose", turIntensityRose);
  123. return map;
  124. }
  125. /**
  126. * 测风塔信息概要
  127. *
  128. * @param windTowerCalculationDataList 统计数据
  129. * @param equipmentAttributeList 属性数据
  130. * @param windTowerInfos 测风塔信息
  131. * @param height 层高
  132. * @param realityCount 数据条数
  133. * @return
  134. */
  135. public Map<String, Object> getWindTowerInfo(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfos, String height, long realityCount, Date startDay, Date endDay) {
  136. Map<String, Object> map = new HashMap<>();
  137. try {
  138. map.put("windInfo", windTowerInfos.get(0));
  139. /*数据记录信息*/
  140. Map<String, Object> dataMap = new HashMap<>();
  141. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  142. //如果查询月份等于当前时间月份就拿数据库最后一天数据的时间作为结束时间
  143. if (endDay.getMonth() == new Date().getMonth()) {
  144. List<Entity> lastData = prophaseWeatherDataService.getLastData(windTowerInfos.get(0).getEquipmentNo());
  145. Timestamp timestamp = new Timestamp(new Date().getTime());
  146. if (lastData != null && lastData.size() > 0) {
  147. timestamp = (Timestamp) lastData.get(0).get("last (ts)");
  148. }
  149. endDay = new Date(timestamp.getTime());
  150. }
  151. Date dayLastTime = DateTimeUtil.getDayLastTime(endDay.getTime());
  152. long count = (dayLastTime.getTime() + 1000 - startDay.getTime()) / (86400000);
  153. long totalCount = count * 144;//时间范围内的总条数
  154. long deletionCount;//缺失条数
  155. BigDecimal totalRate = BigDecimal.valueOf(0.0);//完整率
  156. BigDecimal deletionRate = BigDecimal.valueOf(0.0);//缺失率
  157. BigDecimal aveWs = new BigDecimal(0);//平均风速
  158. //取出heigth层高的平均风速属性
  159. List<EquipmentAttribute> equipmentAttributeList1 = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "awsMonth")).collect(Collectors.toList());
  160. //取出这个层高所有的数据
  161. List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(equipmentAttributeList1.get(0).getId())).collect(Collectors.toList());
  162. deletionCount = totalCount - realityCount;
  163. if (!windTowerCalculationDataList1.isEmpty()) {
  164. //做平均值
  165. aveWs = windTowerCalculationDataList1.stream().map(WindTowerCalculationData::getValue).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(windTowerCalculationDataList1.size()), 2, RoundingMode.HALF_UP);
  166. } else {
  167. deletionCount = totalCount;
  168. }
  169. if (realityCount != 0L) {
  170. totalRate = new BigDecimal(realityCount).divide(new BigDecimal(totalCount), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  171. }
  172. if (deletionCount != 0L) {
  173. deletionRate = new BigDecimal(deletionCount).divide(new BigDecimal(totalCount), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  174. }
  175. dataMap.put("realityCount", realityCount);
  176. dataMap.put("totalCount", totalCount);
  177. dataMap.put("integrityRate", totalRate);
  178. dataMap.put("deletionRate", deletionRate);
  179. dataMap.put("ws", aveWs);
  180. dataMap.put("time", sdf.format(startDay) + " - " + sdf.format(endDay));
  181. map.put("dataInfo", dataMap);
  182. } catch (Exception e) {
  183. e.printStackTrace();
  184. }
  185. return map;
  186. }
  187. /**
  188. * 测风塔统计概要概要
  189. *
  190. * @param windTowerCalculationDatas 统计数据
  191. * @param equipmentAttributeList 属性数据
  192. * @param windTowerInfos 测风塔信息
  193. * @param realityCount 数据条数
  194. * @return
  195. */
  196. public Map<String, Object> statisticsWindTowerStatusData(List<WindTowerCalculationData> windTowerCalculationDatas, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfos, long realityCount, Date startDay, Date endDay) {
  197. Map<String, Object> map = new HashMap<>();
  198. try {
  199. List<Map<String, Object>> dataList = new ArrayList<>();
  200. //如果查询月份等于当前时间月份就拿数据库最后一天数据的时间作为结束时间
  201. if (endDay.getMonth() == new Date().getMonth()) {
  202. List<Entity> lastData = prophaseWeatherDataService.getLastData(windTowerInfos.get(0).getEquipmentNo());
  203. Timestamp timestamp = new Timestamp(new Date().getTime());
  204. if (lastData != null && lastData.size() > 0) {
  205. timestamp = (Timestamp) lastData.get(0).get("last (ts)");
  206. }
  207. endDay = new Date(timestamp.getTime());
  208. }
  209. Date dayLastTime = DateTimeUtil.getDayLastTime(endDay.getTime());
  210. long count = (dayLastTime.getTime() + 1000 - startDay.getTime()) / (86400000);
  211. long totalCount = count * 144;//时间范围内的总条数
  212. // 根据设备属性表中的属性作用查询所有月平均湍流
  213. List<EquipmentAttribute> turbulenceMonths = equipmentAttributeList.stream().filter(e -> "turbulenceMonth".equals(e.getAttributeFunction())).collect(Collectors.toList());
  214. List<EquipmentAttribute> wpdMonths = equipmentAttributeList.stream().filter(e -> "WindPowerDensity".equals(e.getAttributeFunction())).collect(Collectors.toList());
  215. String heights = windTowerInfos.get(0).getHeights();
  216. if (heights == null || heights.equals("")) {
  217. heights = "10,30,50,60,70,80,90,100,110,120,140,150";
  218. }
  219. String[] heightStrs = heights.split(",");
  220. for (String height : heightStrs) {
  221. Map<String, Object> dataMap = new HashMap<>();
  222. long deletionCount;//缺失条数
  223. BigDecimal integrityRate = BigDecimal.valueOf(0.0);//完整率
  224. BigDecimal aveWs = new BigDecimal(0);//平均风速
  225. BigDecimal maxWs = new BigDecimal(0);//最大风速
  226. BigDecimal aveTur = new BigDecimal(0);//平均湍流
  227. BigDecimal aveWpd = new BigDecimal(0);//平均风功率密度
  228. //取出heigth层高的平均风速属性
  229. List<EquipmentAttribute> equipmentAttributeList1 = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "awsMonth")).collect(Collectors.toList());
  230. //取height层高的最大风速
  231. List<EquipmentAttribute> equipmentAttributeListMaxws = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "maxwsMonth")).collect(Collectors.toList());
  232. //取出这个层高所有的数据
  233. List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(equipmentAttributeList1.get(0).getId())).collect(Collectors.toList());
  234. //最大值
  235. List<WindTowerCalculationData> windTowerCalculationDataMaxList = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(equipmentAttributeListMaxws.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getValue).reversed()).collect(Collectors.toList());
  236. if (!windTowerCalculationDataList1.isEmpty()) {
  237. deletionCount = totalCount - realityCount;
  238. if (!windTowerCalculationDataList1.isEmpty()) {
  239. aveWs = windTowerCalculationDataList1.stream().map(WindTowerCalculationData::getValue).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(windTowerCalculationDataList1.size()), 2, RoundingMode.HALF_UP);
  240. }
  241. if (!windTowerCalculationDataMaxList.isEmpty()) {
  242. maxWs = windTowerCalculationDataMaxList.get(0).getValue();
  243. }
  244. } else {
  245. deletionCount = totalCount;
  246. }
  247. if (realityCount != 0L) {
  248. integrityRate = new BigDecimal(realityCount).divide(new BigDecimal(totalCount), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  249. }
  250. if (!turbulenceMonths.isEmpty()) {
  251. /*平均湍流*/
  252. String turbulenceMonth = height + "turbulenceMonth";
  253. // 过滤属性集合找对应的属性id
  254. List<EquipmentAttribute> turbulenceMonthAtt = turbulenceMonths.stream().filter(w -> w.getFieldName().equals(turbulenceMonth)).collect(Collectors.toList());
  255. String turEbId = turbulenceMonthAtt.get(0).getId();
  256. // 过滤一周数据
  257. List<WindTowerCalculationData> turbulenceMonthList = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(turEbId)).collect(Collectors.toList());
  258. if (!turbulenceMonthList.isEmpty()) {
  259. aveTur = turbulenceMonthList.stream().map(WindTowerCalculationData::getValue).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(turbulenceMonthList.size()), 2, RoundingMode.HALF_UP);
  260. }
  261. }
  262. if (!wpdMonths.isEmpty()) {
  263. /*平均风功率密度*/
  264. String wpdMonth = height + "wpdMonth";
  265. // 过滤属性集合找对应的属性id
  266. List<EquipmentAttribute> wpdMonthAtt = wpdMonths.stream().filter(w -> w.getFieldName().equals(wpdMonth)).collect(Collectors.toList());
  267. String wpdEbId = wpdMonthAtt.get(0).getId();
  268. // 过滤一周数据
  269. List<WindTowerCalculationData> wpdMonthList = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(wpdEbId)).collect(Collectors.toList());
  270. if (!wpdMonthList.isEmpty()) {
  271. aveWpd = wpdMonthList.stream().map(WindTowerCalculationData::getValue).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(wpdMonthList.size()), 2, RoundingMode.HALF_UP);
  272. }
  273. }
  274. dataMap.put("height", height);
  275. dataMap.put("deletionCount", deletionCount);
  276. // dataMap.put("freezeCount", 0);//结冰数据
  277. // dataMap.put("abnormalCount", 0);//异常数据
  278. // dataMap.put("lowDataQualityCount", 0);//质量低数据
  279. dataMap.put("integrityRate", integrityRate);
  280. // dataMap.put("efficiency", integrityRate);//有效率
  281. dataMap.put("ws", aveWs);
  282. dataMap.put("maxWs", maxWs);
  283. dataMap.put("tur", aveTur);
  284. dataMap.put("power", aveWpd);
  285. dataList.add(dataMap);
  286. }
  287. /*环境数据*/
  288. //从数据库属性表里查出环境数据的属性
  289. List<EquipmentAttribute> paMax = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("paMAX")).collect(Collectors.toList());
  290. List<EquipmentAttribute> paMin = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("paMIN")).collect(Collectors.toList());
  291. List<EquipmentAttribute> paAve = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("paAVE")).collect(Collectors.toList());
  292. List<EquipmentAttribute> rhMax = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("rhMAX")).collect(Collectors.toList());
  293. List<EquipmentAttribute> rhMin = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("rhMIN")).collect(Collectors.toList());
  294. List<EquipmentAttribute> rhAve = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("rhAVE")).collect(Collectors.toList());
  295. List<EquipmentAttribute> tMax = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("tMAX")).collect(Collectors.toList());
  296. List<EquipmentAttribute> tMin = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("tMIN")).collect(Collectors.toList());
  297. List<EquipmentAttribute> tAve = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("tAVE")).collect(Collectors.toList());
  298. List<EquipmentAttribute> airDensityAve = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("airDensityMonth")).collect(Collectors.toList());
  299. //通过属性过滤数据
  300. List<WindTowerCalculationData> paMaxData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(paMax.get(0).getId())).collect(Collectors.toList());
  301. List<WindTowerCalculationData> paMinData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(paMin.get(0).getId())).collect(Collectors.toList());
  302. List<WindTowerCalculationData> paAveData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(paAve.get(0).getId())).collect(Collectors.toList());
  303. List<WindTowerCalculationData> rhMaxData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(rhMax.get(0).getId())).collect(Collectors.toList());
  304. List<WindTowerCalculationData> rhMinData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(rhMin.get(0).getId())).collect(Collectors.toList());
  305. List<WindTowerCalculationData> rhAveData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(rhAve.get(0).getId())).collect(Collectors.toList());
  306. List<WindTowerCalculationData> tMaxData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(tMax.get(0).getId())).collect(Collectors.toList());
  307. List<WindTowerCalculationData> tMinData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(tMin.get(0).getId())).collect(Collectors.toList());
  308. List<WindTowerCalculationData> tAveData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(tAve.get(0).getId())).collect(Collectors.toList());
  309. List<WindTowerCalculationData> airDensityAveData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(airDensityAve.get(0).getId())).collect(Collectors.toList());
  310. //做平均值
  311. BigDecimal paMaxDataMax = paMaxData.stream().map(WindTowerCalculationData::getValue).max((x1, x2) -> x1.compareTo(x2)).get();
  312. BigDecimal paMinDataMin = paMinData.stream().map(WindTowerCalculationData::getValue).min((x1, x2) -> x1.compareTo(x2)).get();
  313. BigDecimal paAveDataAge = paAveData.stream().map(WindTowerCalculationData::getValue).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(paAveData.size()), 2, RoundingMode.HALF_UP);
  314. BigDecimal rhMaxDataMax = rhMaxData.stream().map(WindTowerCalculationData::getValue).max((x1, x2) -> x1.compareTo(x2)).get();
  315. BigDecimal rhMinDataMin = rhMinData.stream().map(WindTowerCalculationData::getValue).min((x1, x2) -> x1.compareTo(x2)).get();
  316. BigDecimal rhAveDataAge = rhAveData.stream().map(WindTowerCalculationData::getValue).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(rhAveData.size()), 2, RoundingMode.HALF_UP);
  317. BigDecimal tMaxDataMax = tMaxData.stream().map(WindTowerCalculationData::getValue).max((x1, x2) -> x1.compareTo(x2)).get();
  318. BigDecimal tMinDataMin = tMinData.stream().map(WindTowerCalculationData::getValue).min((x1, x2) -> x1.compareTo(x2)).get();
  319. BigDecimal tAveDataAge = tAveData.stream().map(WindTowerCalculationData::getValue).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(tAveData.size()), 2, RoundingMode.HALF_UP);
  320. BigDecimal airDensityAveDataAge = airDensityAveData.stream().map(WindTowerCalculationData::getValue).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(airDensityAveData.size()), 2, RoundingMode.HALF_UP);
  321. //放到list里
  322. List<Map<String, Object>> environmentData = new ArrayList<>();
  323. Map<String, Object> paMap = new HashMap<>();
  324. paMap.put("parameter", "气压(hpa)");
  325. paMap.put("min", paMinDataMin);
  326. paMap.put("max", paMaxDataMax);
  327. paMap.put("ave", paAveDataAge);
  328. Map<String, Object> rhMap = new HashMap<>();
  329. rhMap.put("parameter", "湿度(RH)");
  330. rhMap.put("min", rhMinDataMin.compareTo(new BigDecimal(0)) == 0 ? "--" : rhMinDataMin);
  331. rhMap.put("max", rhMaxDataMax.compareTo(new BigDecimal(0)) == 0 ? "--" : rhMaxDataMax);
  332. rhMap.put("ave", rhAveDataAge.compareTo(new BigDecimal(0)) == 0 ? "--" : rhAveDataAge);
  333. Map<String, Object> tMap = new HashMap<>();
  334. tMap.put("parameter", "气温(°C)");
  335. tMap.put("min", tMinDataMin);
  336. tMap.put("max", tMaxDataMax);
  337. tMap.put("ave", tAveDataAge);
  338. Map<String, Object> airDensityMap = new HashMap<>();
  339. airDensityMap.put("parameter", "空气密度(kg/m³)");
  340. airDensityMap.put("min", airDensityAveDataAge.multiply(BigDecimal.valueOf(0.8)));
  341. airDensityMap.put("max", airDensityAveDataAge.multiply(BigDecimal.valueOf(1.2)));
  342. airDensityMap.put("ave", airDensityAveDataAge);
  343. environmentData.add(paMap);
  344. environmentData.add(rhMap);
  345. environmentData.add(tMap);
  346. environmentData.add(airDensityMap);
  347. map.put("dataList", dataList);
  348. map.put("environment", environmentData);
  349. } catch (Exception e) {
  350. e.printStackTrace();
  351. }
  352. return map;
  353. }
  354. /**
  355. * 测风塔数据时间范围
  356. *
  357. * @return
  358. */
  359. public List<Map<String, Object>> getDataTime() {
  360. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list();
  361. ArrayList<Map<String, Object>> timeList = new ArrayList<>();
  362. for (WindTowerInfo windTowerInfo : windTowerInfoList) {
  363. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  364. HashMap<String, Object> hashMap = new HashMap<>();
  365. Map<String, Long> startAndEnd = prophaseWeatherDataService.getDataTimeStartAndEnd(windTowerInfo.getEquipmentNo());
  366. hashMap.put("time", sdf.format(new Date(startAndEnd.get("startTime"))) + " - " + sdf.format(new Date(startAndEnd.get("endTime"))));
  367. hashMap.put("eqId", windTowerInfo.getEquipmentNo());
  368. timeList.add(hashMap);
  369. }
  370. return timeList;
  371. }
  372. /**
  373. * 测风塔数据时间范围
  374. *
  375. * @return
  376. */
  377. public List<Map<String, Object>> getDataTimeForEveryTower() {
  378. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list();
  379. List<WindTowerInfo> collect = windTowerInfoList.stream().sorted(Comparator.comparing(WindTowerInfo::getEquipmentNo)).collect(Collectors.toList());
  380. ArrayList<Map<String, Object>> timeList = new ArrayList<>();
  381. for (WindTowerInfo windTowerInfo : collect) {
  382. HashMap<String, Object> hashMap = new HashMap<>();
  383. Map<String, Long> startAndEnd = prophaseWeatherDataService.getDataTimeStartAndEnd(windTowerInfo.getEquipmentNo());
  384. //获取去年数据截止的时间
  385. Date yearDay = DateTimeUtil.getYearDay(startAndEnd.get("endTime"));
  386. Date startTime;
  387. if (startAndEnd.get("startTime") < yearDay.getTime()) {
  388. startTime = DateUtil.offsetMonth(yearDay, 1);
  389. } else {
  390. startTime = new Date(startAndEnd.get("startTime"));
  391. }
  392. hashMap.put("startTime", startTime);
  393. hashMap.put("endTime", new Date(startAndEnd.get("endTime")));
  394. hashMap.put("eqId", windTowerInfo.getEquipmentNo());
  395. timeList.add(hashMap);
  396. }
  397. return timeList;
  398. }
  399. /**
  400. * 风速和风功率密度时间曲线图
  401. *
  402. * @param
  403. * @return map
  404. */
  405. public Map<String, Object> getWsAndWpd(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, String height, Date startDay, Date endDay) {
  406. Map<String, Object> map = new HashMap<>();
  407. try {
  408. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  409. // 根据设备属性表中的属性作用查询
  410. List<EquipmentAttribute> wsDayAttList = equipmentAttributeList.stream().filter(e -> "wsDay".equals(e.getAttributeFunction())).collect(Collectors.toList());
  411. List<EquipmentAttribute> wpdMonthAttList = equipmentAttributeList.stream().filter(e -> "WindPowerDensity".equals(e.getAttributeFunction())).collect(Collectors.toList());
  412. // 一年的计算数据
  413. String wsFieldName = height + "awsDay";
  414. String wpdFieldName = height + "wpdDay";
  415. // 过滤属性集合找对应的属性id
  416. List<EquipmentAttribute> wsDayAtt = wsDayAttList.stream().filter(w -> w.getFieldName().equals(wsFieldName)).collect(Collectors.toList());
  417. String wsEbId = wsDayAtt.get(0).getId();
  418. List<EquipmentAttribute> wpdMonthAtt = wpdMonthAttList.stream().filter(w -> w.getFieldName().equals(wpdFieldName)).collect(Collectors.toList());
  419. String wpdEbId = wpdMonthAtt.get(0).getId();
  420. // 过滤一周数据
  421. List<List<Object>> wsDataList = new ArrayList<>();
  422. List<List<Object>> wpdDataList = new ArrayList<>();
  423. for (Long l = startDay.getTime(); l <= endDay.getTime(); l += 86400000L) {
  424. Date finalL = DateTimeUtil.getDayStartTime(l);
  425. List<WindTowerCalculationData> wsList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wsEbId) && w.getTime().equals(finalL)).collect(Collectors.toList());
  426. List<Object> list = new ArrayList<>();
  427. if (!wsList.isEmpty()) {
  428. list.add(sdf.format(wsList.get(0).getTime()));
  429. list.add(wsList.get(0).getValue());
  430. wsDataList.add(list);
  431. } else {
  432. list.add(sdf.format(new Date(l)));
  433. list.add(new BigDecimal(0));
  434. wsDataList.add(list);
  435. }
  436. List<WindTowerCalculationData> wpdList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wpdEbId) && w.getTime().equals(finalL)).collect(Collectors.toList());
  437. List<Object> listWpd = new ArrayList<>();
  438. if (!wpdList.isEmpty()) {
  439. listWpd.add(sdf.format(wpdList.get(0).getTime()));
  440. listWpd.add(wpdList.get(0).getValue());
  441. wpdDataList.add(listWpd);
  442. } else {
  443. listWpd.add(sdf.format(new Date(l)));
  444. listWpd.add(new BigDecimal(0));
  445. wpdDataList.add(listWpd);
  446. }
  447. }
  448. map.put("ws", wsDataList);
  449. map.put("wpd", wpdDataList);
  450. } catch (Exception e) {
  451. e.printStackTrace();
  452. }
  453. return map;
  454. }
  455. /**
  456. * 风速和风速标准差时间曲线图
  457. *
  458. * @param windTowerCalculationDataList 统计数据
  459. * @param equipmentAttributeList 属性数据
  460. * @param height 层高
  461. * @return
  462. */
  463. public Map<String, Object> wsAndWsSta(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, String height, Date startDay, Date endDay) {
  464. // long yesterday = new Date().getTime() - 1000 * 60 * 60 * 24;//昨天
  465. // Date startTime = DateTimeUtil.getDayStartTime(DateTimeUtil.getYearDay(yesterday).getTime());
  466. // Date endTime = DateTimeUtil.getDayLastTime(yesterday);
  467. // List<Long> dateTime = DateTimeUtil.getIntervalTimeByMonth(DateTimeUtil.beginOfMonth(startTime), DateTimeUtil.beginOfMonth(endTime));
  468. Map<String, Object> map = new HashMap<>();
  469. try {
  470. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  471. // 根据设备属性表中的属性作用查询
  472. String wsFieldName = height + "awsDay";
  473. // 过滤属性集合找对应的属性id
  474. List<EquipmentAttribute> wsDayAtt = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(wsFieldName)).collect(Collectors.toList());
  475. String wsEbId = wsDayAtt.get(0).getId();
  476. //取出heigth层高的平均风速标差属性
  477. String staEbId = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "staDay")).collect(Collectors.toList()).get(0).getId();
  478. List<List<Object>> wsDataList = new ArrayList<>();
  479. List<List<Object>> wsStaDataList = new ArrayList<>();
  480. for (Long l = startDay.getTime(); l <= endDay.getTime(); l += 86400000L) {
  481. Date finalL = DateTimeUtil.getDayStartTime(l);
  482. List<WindTowerCalculationData> wsList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wsEbId) && w.getTime().equals(finalL)).collect(Collectors.toList());
  483. List<Object> list = new ArrayList<>();
  484. if (!wsList.isEmpty()) {
  485. list.add(sdf.format(wsList.get(0).getTime()));
  486. list.add(wsList.get(0).getValue());
  487. wsDataList.add(list);
  488. } else {
  489. list.add(sdf.format(new Date(l)));
  490. list.add(new BigDecimal(0));
  491. wsDataList.add(list);
  492. }
  493. //计算风速标准差
  494. List<WindTowerCalculationData> wsStaList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(staEbId) && w.getTime().equals(finalL)).collect(Collectors.toList());
  495. //取出这个层高所有的数据
  496. list = new ArrayList<>();
  497. if (!wsStaList.isEmpty()) {
  498. list.add(sdf.format(wsStaList.get(0).getTime()));
  499. list.add(wsStaList.get(0).getValue());
  500. wsStaDataList.add(list);
  501. } else {
  502. list.add(sdf.format(new Date(l)));
  503. list.add(BigDecimal.ZERO);
  504. wsStaDataList.add(list);
  505. }
  506. }
  507. map.put("ws", wsDataList);
  508. map.put("wsSta", wsStaDataList);
  509. } catch (Exception e) {
  510. e.printStackTrace();
  511. }
  512. return map;
  513. }
  514. /**
  515. * 风速和风速密度日变化
  516. *
  517. * @param height
  518. * @return map
  519. */
  520. public Map<String, Object> getWindPowerDensityAndAverageWindSpeed(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfos, String height) {
  521. Map<String, Object> map = new HashMap<>();
  522. try {
  523. String wpdFieldName = height + "wpd";
  524. String awsFieldName = height + "aws";
  525. List<EquipmentAttribute> wpdFieldNameList = equipmentAttributeList.stream().filter(e -> wpdFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  526. List<EquipmentAttribute> awsFieldNameList = equipmentAttributeList.stream().filter(e -> awsFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  527. if (!wpdFieldNameList.isEmpty() && !awsFieldNameList.isEmpty()) {
  528. String wpdEbId = wpdFieldNameList.get(0).getId();
  529. String awsEbId = awsFieldNameList.get(0).getId();
  530. //平均风速集合
  531. List<WindTowerCalculationData> awsList;
  532. //风功率密度集合
  533. List<WindTowerCalculationData> wpdList;
  534. awsList = windTowerCalculationDataList.stream().filter(w -> awsEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  535. wpdList = windTowerCalculationDataList.stream().filter(w -> wpdEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  536. if (!awsList.isEmpty()) {
  537. map.put("AverageWindSpeed", CalculationUtil.getData24(awsList));
  538. }
  539. if (!wpdList.isEmpty()) {
  540. map.put("WindPowerDensity", CalculationUtil.getData24(wpdList));
  541. }
  542. }
  543. map.put("table", getWpdTable(windTowerCalculationDataList, equipmentAttributeList, windTowerInfos));
  544. } catch (Exception e) {
  545. e.printStackTrace();
  546. }
  547. return map;
  548. }
  549. /**
  550. * 风速和风速密度日变化表格
  551. *
  552. * @return map
  553. */
  554. public Map<String, Object> getWpdTable(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfos) {
  555. Map<String, Object> map = new HashMap<>();
  556. List<List<BigDecimal>> list = new ArrayList<>();
  557. try {
  558. String height;
  559. height = windTowerInfos.get(0).getHeights();
  560. if (height == null || height.equals("")) {
  561. height = "10,30,50,60,70,80,90,100,110,120,140,150";
  562. }
  563. String[] heightAll = height.split(",");
  564. List<String> tableHeader = new ArrayList<>();
  565. tableHeader.add("时间");
  566. for (String str : heightAll) {
  567. List<BigDecimal> wsDataList = new ArrayList<>();
  568. List<BigDecimal> wpdDataList = new ArrayList<>();
  569. tableHeader.add(str + "m风速(m/s)");
  570. tableHeader.add(str + "m风功率密度(w/㎡)");
  571. String wpdFieldName = str + "wpd";
  572. String awsFieldName = str + "aws";
  573. List<EquipmentAttribute> wpdFieldNameList = equipmentAttributeList.stream().filter(e -> wpdFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  574. List<EquipmentAttribute> awsFieldNameList = equipmentAttributeList.stream().filter(e -> awsFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  575. //选择时间段的平均风速
  576. BigDecimal avgWs = new BigDecimal(0);
  577. //选择时间段的风功率密度
  578. BigDecimal avgWpd = new BigDecimal(0);
  579. if (!wpdFieldNameList.isEmpty() && !awsFieldNameList.isEmpty()) {
  580. String wpdEbId = wpdFieldNameList.get(0).getId();
  581. String awsEbId = awsFieldNameList.get(0).getId();
  582. //平均风速集合
  583. List<WindTowerCalculationData> awsList;
  584. //风功率密度集合
  585. List<WindTowerCalculationData> wpdList;
  586. awsList = windTowerCalculationDataList.stream().filter(w -> awsEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  587. wpdList = windTowerCalculationDataList.stream().filter(w -> wpdEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  588. if (!awsList.isEmpty()) {
  589. BigDecimal wsSum = new BigDecimal(0);
  590. for (WindTowerCalculationData data : awsList) {
  591. wsSum = wsSum.add(data.getValue());
  592. }
  593. //如何总和不为0
  594. if (wsSum.compareTo(new BigDecimal(0)) != 0) {
  595. avgWs = wsSum.divide(new BigDecimal(awsList.size()), 2, RoundingMode.HALF_UP);
  596. }
  597. wsDataList = getData24(awsList);
  598. wsDataList.add(avgWs);
  599. }
  600. if (!wpdList.isEmpty()) {
  601. BigDecimal wpdSum = new BigDecimal(0);
  602. for (WindTowerCalculationData data : wpdList) {
  603. wpdSum = wpdSum.add(data.getValue());
  604. }
  605. //如何总和不为0
  606. if (wpdSum.compareTo(new BigDecimal(0)) != 0) {
  607. avgWpd = wpdSum.divide(new BigDecimal(wpdList.size()), 2, RoundingMode.HALF_UP);
  608. }
  609. wpdDataList = getData24(wpdList);
  610. wpdDataList.add(avgWpd);
  611. }
  612. }
  613. list.add(wsDataList);
  614. list.add(wpdDataList);
  615. }
  616. map.put("tableHeader", tableHeader);
  617. map.put("data", list);
  618. } catch (Exception e) {
  619. e.printStackTrace();
  620. }
  621. return map;
  622. }
  623. /**
  624. * 风速和风速密度各月日变化
  625. *
  626. * @param height
  627. * @return map
  628. */
  629. public List<Map<String, Object>> getMonthWsAndWpd(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, String height, Date startDay, Date endDay) {
  630. List<Map<String, Object>> list = new ArrayList<>();
  631. try {
  632. SimpleDateFormat sdf = new SimpleDateFormat("M");
  633. String wpdFieldName = height + "wpd";
  634. String awsFieldName = height + "aws";
  635. List<EquipmentAttribute> wpdFieldNameList = equipmentAttributeList.stream().filter(e -> wpdFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  636. List<EquipmentAttribute> awsFieldNameList = equipmentAttributeList.stream().filter(e -> awsFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  637. List<String> nullList = new ArrayList<>();
  638. if (!wpdFieldNameList.isEmpty() && !awsFieldNameList.isEmpty()) {
  639. String wpdEbId = wpdFieldNameList.get(0).getId();
  640. String awsEbId = awsFieldNameList.get(0).getId();
  641. List<WindTowerCalculationData> awsAllList = windTowerCalculationDataList.stream().filter(w -> awsEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  642. List<WindTowerCalculationData> wpdAllList = windTowerCalculationDataList.stream().filter(w -> wpdEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  643. List<Long> intervalTimeByMonth = DateTimeUtil.getIntervalTimeByMonth(startDay, endDay);
  644. for (int i = 1; i <= 12; i++) {
  645. //平均风速集合
  646. List<WindTowerCalculationData> awsList = new ArrayList<>();
  647. //风功率密度集合
  648. List<WindTowerCalculationData> wpdList = new ArrayList<>();
  649. Map<String, Object> dataMap = new HashMap<>();
  650. for (Long l : intervalTimeByMonth) {
  651. //判断月份是否相等
  652. if (String.valueOf(i).equals(sdf.format(new Date(l)))) {
  653. Date monthStartTime = DateTimeUtil.beginOfMonth(new Date(l));
  654. Date monthendTime = DateTimeUtil.endOfMonth(new Date(l));
  655. awsList = awsAllList.stream().filter(w -> w.getTime().compareTo(monthStartTime) >= 0 && w.getTime().compareTo(monthendTime) < 0).collect(Collectors.toList());
  656. wpdList = wpdAllList.stream().filter(w -> w.getTime().compareTo(monthStartTime) >= 0 && w.getTime().compareTo(monthendTime) < 0).collect(Collectors.toList());
  657. }
  658. }
  659. if (!awsList.isEmpty()) {
  660. dataMap.put("ws", CalculationUtil.getData24(awsList));
  661. } else {
  662. dataMap.put("ws", nullList);
  663. }
  664. if (!wpdList.isEmpty()) {
  665. dataMap.put("wpd", CalculationUtil.getData24(wpdList));
  666. } else {
  667. dataMap.put("wpd", nullList);
  668. }
  669. dataMap.put("time", i + "月");
  670. list.add(dataMap);
  671. }
  672. }
  673. } catch (Exception e) {
  674. e.printStackTrace();
  675. }
  676. return list;
  677. }
  678. /**
  679. * 风速和风速密度年变化曲线
  680. *
  681. * @return map
  682. */
  683. public Map<String, Object> getYearWsAndWpd(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, String height, Date startDay, Date endDay) {
  684. Map<String, Object> map = new HashMap<>();
  685. try {
  686. // Long yesterday = new Date().getTime() - 1000 * 60 * 60 * 24;//昨天
  687. // Date startTime = DateTimeUtil.getDayStartTime(DateTimeUtil.getYearDay(yesterday).getTime());//报告的开始时间 一年前的昨天的00:00:00
  688. // Date endTime = DateTimeUtil.getDayLastTime(yesterday);//报告的结束时间 昨天的23:59:59
  689. /*设备属性信息*/
  690. String wpdFieldName = height + "wpdMonth"; //wpdMonth awsDay
  691. String awsFieldName = height + "awsMonth";
  692. List<EquipmentAttribute> wpdFieldNameList = equipmentAttributeList.stream().filter(e -> wpdFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  693. List<EquipmentAttribute> awsFieldNameList = equipmentAttributeList.stream().filter(e -> awsFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  694. List<BigDecimal> wsDataList = new ArrayList<>();
  695. List<BigDecimal> wpdDataList = new ArrayList<>();
  696. List<String> timeList = new ArrayList<>();
  697. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
  698. if (!wpdFieldNameList.isEmpty() && !awsFieldNameList.isEmpty()) {
  699. String wpdEbId = wpdFieldNameList.get(0).getId();
  700. String awsEbId = awsFieldNameList.get(0).getId();
  701. //平均风速集合
  702. List<WindTowerCalculationData> awsAllList = new ArrayList<>();
  703. //风功率密度集合
  704. List<WindTowerCalculationData> wpdAllList = new ArrayList<>();
  705. awsAllList = windTowerCalculationDataList.stream().filter(w -> awsEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  706. wpdAllList = windTowerCalculationDataList.stream().filter(w -> wpdEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  707. List<Long> timeByMonth = DateTimeUtil.getIntervalTimeByMonth(startDay, endDay);
  708. for (Long aLong : timeByMonth) {
  709. BigDecimal avgWs = new BigDecimal(0);
  710. BigDecimal avgWpd = new BigDecimal(0);
  711. //过滤平均风速集合
  712. List<WindTowerCalculationData> awsList = new ArrayList<>();
  713. //过滤风功率密度集合
  714. List<WindTowerCalculationData> wpdList = new ArrayList<>();
  715. // awsList = awsAllList.stream().filter(w -> w.getTime().compareTo(monthStartTime) >= 0 && w.getTime().compareTo(monthendTime) < 0 && w.getValue() != null && w.getValue().compareTo(new BigDecimal(-99)) != 0).collect(Collectors.toList());
  716. awsList = awsAllList.stream().filter(w -> w.getTime().equals(new Date(aLong)) && w.getValue() != null && w.getValue().compareTo(new BigDecimal(-99)) != 0).collect(Collectors.toList());
  717. wpdList = wpdAllList.stream().filter(w -> w.getTime().equals(new Date(aLong)) && w.getValue() != null && w.getValue().compareTo(new BigDecimal(-99)) != 0).collect(Collectors.toList());
  718. if (!awsList.isEmpty()) {
  719. List<BigDecimal> valueList = awsList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  720. avgWs = valueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(valueList.size()), 2, RoundingMode.HALF_UP);
  721. }
  722. wsDataList.add(avgWs);
  723. if (!wpdList.isEmpty()) {
  724. List<BigDecimal> valueList = wpdList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  725. avgWpd = valueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(valueList.size()), 2, RoundingMode.HALF_UP);
  726. }
  727. wpdDataList.add(avgWpd);
  728. timeList.add(sdf.format(aLong));
  729. }
  730. }
  731. map.put("wsList", wsDataList);
  732. map.put("wpdList", wpdDataList);
  733. map.put("time", timeList);
  734. } catch (Exception e) {
  735. e.printStackTrace();
  736. }
  737. return map;
  738. }
  739. /**
  740. * 风速和风速密度各月日变化表格
  741. *
  742. * @return map
  743. */
  744. public Map<String, Object> getMonthWpdTable(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfos, Date startDay, Date endDay) {
  745. Map<String, Object> map = new HashMap<>();
  746. List<List<BigDecimal>> list = new ArrayList<>();
  747. List<String> timeList = new ArrayList<>();
  748. try {
  749. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
  750. List<Long> timeByMonth = DateTimeUtil.getIntervalTimeByMonth(startDay, endDay);
  751. for (Long aLong : timeByMonth) {
  752. Date monthStartTime = DateTimeUtil.getDayStartTime(aLong);
  753. timeList.add(sdf.format(monthStartTime));
  754. }
  755. timeList.add("平均");
  756. //获取风速层高
  757. String height;
  758. height = windTowerInfos.get(0).getHeights();
  759. if (height == null || height.equals("")) {
  760. height = "10,30,50,60,70,80,90,100,110,120,140,150";
  761. }
  762. String[] heightAll = height.split(",");
  763. List<String> tableHeader = new ArrayList<>();
  764. tableHeader.add("月份");
  765. for (String str : heightAll) {
  766. List<BigDecimal> wsDataList = new ArrayList<>();
  767. List<BigDecimal> wpdDataList = new ArrayList<>();
  768. tableHeader.add(str + "m风速(m/s)");
  769. tableHeader.add(str + "m风功率密度(w/㎡)");
  770. String wpdFieldName = str + "wpdMonth"; //wpdMonth awsDay
  771. String awsFieldName = str + "awsMonth";
  772. List<EquipmentAttribute> wpdFieldNameList = equipmentAttributeList.stream().filter(e -> wpdFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  773. List<EquipmentAttribute> awsFieldNameList = equipmentAttributeList.stream().filter(e -> awsFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  774. BigDecimal sumAveWs = new BigDecimal(0);
  775. BigDecimal sumAveWpd = new BigDecimal(0);
  776. if (!wpdFieldNameList.isEmpty() && !awsFieldNameList.isEmpty()) {
  777. String wpdEbId = wpdFieldNameList.get(0).getId();
  778. String awsEbId = awsFieldNameList.get(0).getId();
  779. //平均风速集合
  780. List<WindTowerCalculationData> awsAllList;
  781. //风功率密度集合
  782. List<WindTowerCalculationData> wpdAllList;
  783. awsAllList = windTowerCalculationDataList.stream().filter(w -> awsEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  784. wpdAllList = windTowerCalculationDataList.stream().filter(w -> wpdEbId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  785. for (Long aLong : timeByMonth) {
  786. BigDecimal avgWs = new BigDecimal(0);
  787. BigDecimal avgWpd = new BigDecimal(0);
  788. //过滤平均风速集合
  789. List<WindTowerCalculationData> awsList;
  790. //过滤风功率密度集合
  791. List<WindTowerCalculationData> wpdList;
  792. awsList = awsAllList.stream().filter(w -> w.getTime().equals(new Date(aLong))).collect(Collectors.toList());
  793. wpdList = wpdAllList.stream().filter(w -> w.getTime().equals(new Date(aLong))).collect(Collectors.toList());
  794. if (!awsList.isEmpty()) {
  795. List<BigDecimal> valueList = awsList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  796. avgWs = valueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(valueList.size()), 2, RoundingMode.HALF_UP);
  797. }
  798. wsDataList.add(avgWs);
  799. if (!wpdList.isEmpty()) {
  800. List<BigDecimal> valueList = wpdList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  801. avgWpd = valueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(valueList.size()), 2, RoundingMode.HALF_UP);
  802. }
  803. wpdDataList.add(avgWpd);
  804. }
  805. int wsListCount = wsDataList.stream().filter(w -> w.compareTo(new BigDecimal(0)) != 0).collect(Collectors.toList()).size();
  806. int wpdListCount = wpdDataList.stream().filter(w -> w.compareTo(new BigDecimal(0)) != 0).collect(Collectors.toList()).size();
  807. if (wsListCount != 0) {
  808. sumAveWs = wsDataList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(wsListCount), 2, RoundingMode.HALF_UP);
  809. }
  810. if (wpdListCount != 0) {
  811. sumAveWpd = wpdDataList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(wpdListCount), 2, RoundingMode.HALF_UP);
  812. }
  813. wsDataList.add(sumAveWs);
  814. wpdDataList.add(sumAveWpd);
  815. }
  816. list.add(wsDataList);
  817. list.add(wpdDataList);
  818. }
  819. map.put("tableHeader", tableHeader);
  820. map.put("data", list);
  821. map.put("month", timeList);
  822. } catch (Exception e) {
  823. e.printStackTrace();
  824. }
  825. return map;
  826. }
  827. /**
  828. * pdf威布尔
  829. *
  830. * @param height 层高
  831. * @return weibull
  832. */
  833. public Map<String, Object> pdfWeibull(List<EquipmentAttribute> equipmentAttributeList, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, String height) {
  834. Map<String, Object> map = new HashMap<>();
  835. List<BigDecimal> wsList = new ArrayList<>();
  836. try {
  837. double e = 2.71828183;
  838. // 风速集合
  839. String ebId = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(height + "aws")).collect(Collectors.toList()).get(0).getId();
  840. List<WindTowerCalculationData> calculationDataList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(ebId)).collect(Collectors.toList());
  841. for (WindTowerCalculationData w : calculationDataList) {
  842. wsList.add(w.getValue());
  843. }
  844. TreeMap<BigDecimal, List<BigDecimal>> wsMap = new TreeMap<>();
  845. if (!wsList.isEmpty()) {
  846. ArrayList<Object> arrayWsList = new ArrayList<>(wsList);
  847. //把风速集合传入,计算A、K
  848. ProbabilityPlot probabilityPlot = new ProbabilityPlot(arrayWsList);
  849. probabilityPlot.suppressDisplay();
  850. double K = probabilityPlot.weibullTwoParGamma();
  851. double A = probabilityPlot.weibullTwoParSigma();
  852. map.put("K", BigDecimal.valueOf(K).setScale(2, RoundingMode.HALF_UP).doubleValue());
  853. map.put("A", BigDecimal.valueOf(A).setScale(2, RoundingMode.HALF_UP).doubleValue());
  854. BigDecimal wsAve = wsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(wsList.size()), 2, RoundingMode.HALF_UP);
  855. map.put("wsAve", wsAve);
  856. /*根据风速过滤出风速区间集合*/
  857. for (BigDecimal ws : wsList) {
  858. // 风速区间
  859. BigDecimal speedLevel = BigDecimal.valueOf(Math.ceil(ws.subtract(BigDecimal.valueOf(0.5)).doubleValue()));
  860. if (wsMap.containsKey(speedLevel)) {
  861. wsMap.get(speedLevel).add(ws);
  862. } else {
  863. wsMap.put(speedLevel, new ArrayList<>());
  864. wsMap.get(speedLevel.setScale(1, RoundingMode.HALF_UP)).add(ws);
  865. }
  866. }
  867. /*风速频率*/
  868. List<List<BigDecimal>> wsFreList = new ArrayList<>();
  869. /*威布尔*/
  870. List<List<BigDecimal>> weibullList = new ArrayList<>();
  871. wsMap.forEach((key, val) -> {
  872. List<BigDecimal> list = new ArrayList<>();
  873. List<BigDecimal> tempList = new ArrayList<>();
  874. BigDecimal wsFrequency = new BigDecimal(val.size()).divide(new BigDecimal(wsList.size()), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  875. list.add(key.setScale(0, RoundingMode.HALF_UP));
  876. list.add(wsFrequency);
  877. wsFreList.add(list);
  878. /*区间威布尔累加求和求平均值*/
  879. BigDecimal aveWs = val.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(val.size()), 2, RoundingMode.HALF_UP);
  880. BigDecimal weibull = CalculationUtil.getBigDecimal(e, aveWs.doubleValue(), K, A);
  881. tempList.add(key.setScale(0, RoundingMode.HALF_UP));
  882. tempList.add(weibull);
  883. weibullList.add(tempList);
  884. });
  885. map.put("wsFrequency", wsFreList);
  886. map.put("weibull", weibullList);
  887. }
  888. } catch (Exception e) {
  889. e.printStackTrace();
  890. }
  891. return map;
  892. }
  893. /**
  894. * 一年玫瑰图
  895. *
  896. * @param height 层高
  897. * @return
  898. * @throws Exception
  899. */
  900. public Map<String, Object> roseCharts(List<WindDirectionStatisticsData> windDirectionStatisticsData, List<EquipmentAttribute> equipmentAttributeList, String height) {
  901. Map<String, Object> map = new HashMap<>();
  902. try {
  903. // 若层高包含A按照去掉A的层高计算
  904. if (height.contains("A")) {
  905. height = height.substring(0, height.length() - 1);
  906. }
  907. map.put("wd", getwd(windDirectionStatisticsData, equipmentAttributeList, height));
  908. map.put("power", getPower(windDirectionStatisticsData, equipmentAttributeList, height));
  909. } catch (Exception e) {
  910. e.printStackTrace();
  911. }
  912. return map;
  913. }
  914. /**
  915. * 各月玫瑰图
  916. *
  917. * @param height 层高
  918. * @return
  919. * @throws Exception
  920. */
  921. public Map<String, Object> getMonthRoseCharts(List<WindDirectionStatisticsData> windDirectionStatisticsData, List<EquipmentAttribute> equipmentAttributeList, String height) {
  922. Map<String, Object> map = new HashMap<>();
  923. List<Map<String, Object>> wdList = new ArrayList<>();
  924. List<Map<String, Object>> powerList = new ArrayList<>();
  925. SimpleDateFormat monthSdf = new SimpleDateFormat("M");
  926. try {
  927. // 若层高包含A按照去掉A的层高计算
  928. if (height.contains("A")) {
  929. height = height.substring(0, height.length() - 1);
  930. }
  931. for (int i = 1; i <= 12; i++) {
  932. Map<String, Object> wdMap = new HashMap<>();
  933. Map<String, Object> powerMap = new HashMap<>();
  934. // Date monthStartTime = DateTimeUtil.getDayStartTime(DateTimeUtil.mouthOneDay(i).getTime());
  935. // Date monthendTime = DateTimeUtil.getDayLastTime(DateTimeUtil.mouthLastDay(i).getTime());
  936. //过滤时间区间集合
  937. List<WindDirectionStatisticsData> filterList = new ArrayList<>();
  938. // filterList = windDirectionStatisticsData.stream().filter(w -> w.getTime().compareTo(monthStartTime) >= 0 && w.getTime().compareTo(monthendTime) < 0).collect(Collectors.toList());
  939. int finalI = i;
  940. filterList = windDirectionStatisticsData.stream().filter(w -> monthSdf.format(w.getTime()).equals(String.valueOf(finalI))).collect(Collectors.toList());
  941. wdMap.put("time", i + "月");
  942. powerMap.put("time", i + "月");
  943. //如果月份数据为空就放null
  944. if (!filterList.isEmpty()) {
  945. List<Map<String, Object>> getwd = getwd(filterList, equipmentAttributeList, height);
  946. wdMap.put("data", getwd);
  947. powerMap.put("data", getPower(filterList, equipmentAttributeList, height));
  948. } else {
  949. wdMap.put("data", null);
  950. powerMap.put("data", null);
  951. }
  952. wdList.add(wdMap);
  953. powerList.add(powerMap);
  954. }
  955. map.put("wd", wdList);
  956. map.put("power", powerList);
  957. } catch (Exception e) {
  958. e.printStackTrace();
  959. }
  960. return map;
  961. }
  962. /*风向玫瑰图数据*/
  963. public List<Map<String, Object>> getwd(List<WindDirectionStatisticsData> windDirectionStatisticsData, List<EquipmentAttribute> equipmentAttributeList, String height) {
  964. List<Map<String, Object>> list = new ArrayList<>();
  965. String wdFieldName = height + "monthWdRose";
  966. // 过滤获取ebId
  967. List<EquipmentAttribute> wdEquipmentAttribute = equipmentAttributeList.stream().filter(e -> wdFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  968. // 获取风向统计数据
  969. List<WindDirectionStatisticsData> wdList = windDirectionStatisticsData.stream().filter(e -> e.getEbId().equals(wdEquipmentAttribute.get(0).getId())).collect(Collectors.toList());
  970. /*玫瑰图风向枚举*/
  971. for (WindDirectionEnum value : WindDirectionEnum.values()) {
  972. Map<String, Object> wdMap = new HashMap<>();
  973. // 根据风向过滤统计表
  974. List<WindDirectionStatisticsData> filterWdList = wdList.stream().filter(e -> e.getDirection().equals(value.name())).collect(Collectors.toList());
  975. // 提取过滤的value值
  976. List<BigDecimal> filterwdValueList = filterWdList.stream().map(WindDirectionStatisticsData::getValue).filter(w -> w != null).collect(Collectors.toList());
  977. // 累加保留两位小数
  978. BigDecimal sumWd = null;
  979. if (!filterwdValueList.isEmpty()) {
  980. sumWd = filterwdValueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
  981. }
  982. wdMap.put(value.name(), sumWd);
  983. list.add(wdMap);
  984. }
  985. return list;
  986. }
  987. /*风能玫瑰图数据*/
  988. public List<Map<String, Object>> getPower(List<WindDirectionStatisticsData> windDirectionStatisticsData, List<EquipmentAttribute> equipmentAttributeList, String height) {
  989. List<Map<String, Object>> list = new ArrayList<>();
  990. String powerFieldName = height + "monthPowerRose";
  991. // 过滤获取ebId
  992. List<EquipmentAttribute> powerEquipmentAttribute = equipmentAttributeList.stream().filter(e -> powerFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  993. // 获取风向统计数据
  994. List<WindDirectionStatisticsData> powerList = windDirectionStatisticsData.stream().filter(e -> e.getEbId().equals(powerEquipmentAttribute.get(0).getId())).collect(Collectors.toList());
  995. /*玫瑰图风向枚举*/
  996. for (WindDirectionEnum value : WindDirectionEnum.values()) {
  997. Map<String, Object> powerMap = new HashMap<>();
  998. // 根据风向过滤统计表
  999. List<WindDirectionStatisticsData> filterPowerList = powerList.stream().filter(e -> e.getDirection().equals(value.name())).collect(Collectors.toList());
  1000. // 提取过滤的value值
  1001. List<BigDecimal> filterPowerValueList = filterPowerList.stream().map(WindDirectionStatisticsData::getValue).filter(w -> w != null).collect(Collectors.toList());
  1002. // 累加保留两位小数
  1003. BigDecimal sumPower = null;
  1004. if (!filterPowerValueList.isEmpty()) {
  1005. sumPower = filterPowerValueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
  1006. }
  1007. powerMap.put(value.name(), sumPower);
  1008. list.add(powerMap);
  1009. }
  1010. return list;
  1011. }
  1012. /**
  1013. * 空气密度
  1014. *
  1015. * @return
  1016. * @throws Exception
  1017. */
  1018. public Map<String, Object> getAirDensity(List<WindTowerCalculationData> windTowerCalculationDatas, List<EquipmentAttribute> equipmentAttributeList, Date startDay, Date endDay) {
  1019. Map<String, Object> map = new HashMap<>();
  1020. List<String> timeList = new ArrayList<>();
  1021. List<String> monthTimeList = new ArrayList<>();
  1022. List<BigDecimal> tList = new ArrayList<>();
  1023. List<BigDecimal> paList = new ArrayList<>();
  1024. try {
  1025. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
  1026. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
  1027. List<EquipmentAttribute> tAVE = equipmentAttributeList.stream().filter(e -> "tDay".equals(e.getFieldName())).collect(Collectors.toList());
  1028. List<EquipmentAttribute> paAVE = equipmentAttributeList.stream().filter(e -> "paDay".equals(e.getFieldName())).collect(Collectors.toList());
  1029. List<EquipmentAttribute> airDensityMonth = equipmentAttributeList.stream().filter(e -> "airDensityMonth".equals(e.getFieldName())).collect(Collectors.toList());
  1030. List<EquipmentAttribute> airDensityDayForYear = equipmentAttributeList.stream().filter(e -> "airDensityDayForYear".equals(e.getFieldName())).collect(Collectors.toList());
  1031. List<WindTowerCalculationData> tAVEData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(tAVE.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1032. List<WindTowerCalculationData> paAVEData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(paAVE.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1033. List<WindTowerCalculationData> airDensityMonthData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(airDensityMonth.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1034. List<WindTowerCalculationData> airDensityDayForYearData = windTowerCalculationDatas.stream().filter(w -> w.getEbId().equals(airDensityDayForYear.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1035. /*温度气压曲线*/
  1036. //补点做法
  1037. for (Long l = startDay.getTime(); l <= endDay.getTime(); l += 86400000L) {
  1038. Date finalL = DateUtil.beginOfDay(new Date(l));
  1039. String dates = sdf1.format(finalL);
  1040. List<WindTowerCalculationData> collect = tAVEData.stream().filter(t -> sdf1.format(t.getTime()).equals(dates)).collect(Collectors.toList());
  1041. if (!collect.isEmpty()) {
  1042. tList.add(collect.get(0).getValue());
  1043. } else {
  1044. tList.add(null);
  1045. }
  1046. List<WindTowerCalculationData> collect1 = paAVEData.stream().filter(p -> sdf1.format(p.getTime()).equals(dates)).collect(Collectors.toList());
  1047. if (!collect1.isEmpty()) {
  1048. paList.add(collect1.get(0).getValue());
  1049. } else {
  1050. paList.add(null);
  1051. }
  1052. timeList.add(sdf.format(finalL));
  1053. }
  1054. map.put("time", timeList);
  1055. map.put("t", tList);
  1056. map.put("pa", paList);
  1057. // //月平均温度
  1058. // for (WindTowerCalculationData w : tAVEData) {
  1059. // timeList.add(sdf.format(w.getTime()));
  1060. // tList.add(w.getValue());
  1061. // }
  1062. // //月平均气压
  1063. // for (WindTowerCalculationData w : paAVEData) {
  1064. // paList.add(w.getValue());
  1065. // }
  1066. // map.put("time", timeList);
  1067. // map.put("t", tList);
  1068. // map.put("pa", paList);
  1069. /*空气密度日变化*/
  1070. List<BigDecimal> airDensityList = new ArrayList<>();
  1071. if (!airDensityDayForYearData.isEmpty()) {
  1072. airDensityList = CalculationUtil.getData24(airDensityDayForYearData);
  1073. }
  1074. List<BigDecimal> airDensityCollect = airDensityList.stream().filter(w -> w.compareTo(new BigDecimal(0)) != 0).collect(Collectors.toList());
  1075. BigDecimal ave24AirDensity = BigDecimal.ZERO;
  1076. if (!airDensityCollect.isEmpty()) {
  1077. ave24AirDensity = airDensityCollect.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(24), 3, RoundingMode.HALF_UP);
  1078. }
  1079. map.put("dayAirDensity", airDensityList);
  1080. map.put("aveDayAirDensity", ave24AirDensity);
  1081. /*空气年变化*/
  1082. List<BigDecimal> monthList = new ArrayList<>();
  1083. SimpleDateFormat sdfMonth = new SimpleDateFormat("M");
  1084. for (int i = 1; i <= 12; i++) {
  1085. // Date monthStartTime = DateTimeUtil.getDayStartTime(DateTimeUtil.mouthOneDay(i).getTime());
  1086. //过滤时间区间集合
  1087. List<WindTowerCalculationData> filterList = new ArrayList<>();
  1088. BigDecimal value = new BigDecimal(0);
  1089. int finalI = i;
  1090. filterList = airDensityMonthData.stream().filter(w -> sdfMonth.format(w.getTime()).equals(String.valueOf(finalI))).collect(Collectors.toList());
  1091. if (!filterList.isEmpty()) {
  1092. value = filterList.get(0).getValue();
  1093. }
  1094. monthList.add(value);
  1095. monthTimeList.add(i + "月");
  1096. }
  1097. // for (WindTowerCalculationData w : airDensityMonthData) {
  1098. // monthTimeList.add(sdf.format(w.getTime()));
  1099. // monthList.add(w.getValue());
  1100. // }
  1101. List<BigDecimal> collect = monthList.stream().filter(w -> w.compareTo(new BigDecimal(0)) != 0).collect(Collectors.toList());
  1102. BigDecimal yearAveAirDensity = new BigDecimal(0);
  1103. if (!collect.isEmpty()) {
  1104. yearAveAirDensity = collect.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(collect.size()), 3, RoundingMode.HALF_UP);
  1105. }
  1106. map.put("monthTime", monthTimeList);
  1107. map.put("yearAirDensity", monthList);
  1108. map.put("yearAveAirDensity", yearAveAirDensity);
  1109. } catch (Exception e) {
  1110. e.printStackTrace();
  1111. }
  1112. return map;
  1113. }
  1114. /**
  1115. * 获取风切变指数(风向玫瑰图)
  1116. *
  1117. * @param height
  1118. */
  1119. public List<Map<String, Object>> getWindShearRose(List<WindDirectionStatisticsData> windDirectionStatisticsData, List<EquipmentAttribute> equipmentAttributeList, String height) {
  1120. List<Map<String, Object>> list = new ArrayList<>();
  1121. try {
  1122. // 若层高包含A按照去掉A的层高计算
  1123. if (height.contains("A")) {
  1124. height = height.substring(0, height.length() - 1);
  1125. }
  1126. String shearFieldName = height + "monthShearRose";
  1127. // 过滤获取ebId
  1128. List<EquipmentAttribute> shearEquipmentAttribute = equipmentAttributeList.stream().filter(e -> shearFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  1129. // 获取风向统计数据
  1130. List<WindDirectionStatisticsData> shearList = windDirectionStatisticsData.stream().filter(e -> e.getEbId().equals(shearEquipmentAttribute.get(0).getId())).collect(Collectors.toList());
  1131. for (WindDirectionEnum value : WindDirectionEnum.values()) {
  1132. Map<String, Object> map = new HashMap<>();
  1133. // 根据风向过滤统计表
  1134. List<WindDirectionStatisticsData> filterShearList = shearList.stream().filter(e -> e.getDirection().equals(value.name())).collect(Collectors.toList());
  1135. // 提取过滤的value值
  1136. List<BigDecimal> filterShearValueList = filterShearList.stream().map(WindDirectionStatisticsData::getValue).filter(w -> w != null).collect(Collectors.toList());
  1137. // 累加保留两位小数
  1138. BigDecimal sumShear = null;
  1139. if (!filterShearValueList.isEmpty()) {
  1140. sumShear = filterShearValueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
  1141. }
  1142. map.put(value.name(), sumShear);
  1143. list.add(map);
  1144. }
  1145. } catch (Exception e) {
  1146. e.printStackTrace();
  1147. }
  1148. return list;
  1149. }
  1150. /**
  1151. * 风切变日/年变化
  1152. *
  1153. * @return
  1154. * @throws Exception
  1155. */
  1156. public Map<String, Object> getWindShear(List<WindTowerCalculationData> windTowerCalculationDataLists, List<EquipmentAttribute> equipmentAttributeList, String height) {
  1157. Map<String, Object> map = new HashMap<>();
  1158. try {
  1159. List<BigDecimal> dayResults = new ArrayList<>();//日变化
  1160. List<BigDecimal> yearResults = new ArrayList<>();//年变化
  1161. List<String> monthTimeList = new ArrayList<>();
  1162. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
  1163. SimpleDateFormat sdf = new SimpleDateFormat("M");
  1164. String shearFieldName = "windShear";
  1165. List<EquipmentAttribute> shearFieldNameList = equipmentAttributeList.stream().filter(e -> shearFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  1166. if (!shearFieldNameList.isEmpty()) {
  1167. String ebId = shearFieldNameList.get(0).getId(); //属性id
  1168. //查询风切变 月平均数据 根据时间,层高,设备id 并根据时间升序排列
  1169. List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataLists.stream().filter(w -> ebId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1170. if (!windTowerCalculationDataList.isEmpty()) {
  1171. /*日变化*/
  1172. long startTime1 = DateMomentUtil.getDayStartTime(DateUtils.addDays(new Date(), -1).getTime());
  1173. long endTime1 = startTime1 + 86399000L;
  1174. for (long time = startTime1; time <= endTime1; time += 3600000L) {
  1175. Long finalTime = time;
  1176. String format = simpleDateFormat.format(finalTime);
  1177. List<BigDecimal> collect = windTowerCalculationDataList.stream().filter(s -> simpleDateFormat.format(s.getTime())
  1178. .equals(format) && s.getValue() != null && s.getValue().compareTo(new BigDecimal(-99)) != 0)
  1179. .map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  1180. BigDecimal ave = new BigDecimal(0);
  1181. if (!collect.isEmpty()) {
  1182. ave = collect.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(collect.size()), 3, RoundingMode.HALF_UP);
  1183. }
  1184. dayResults.add(ave);
  1185. }
  1186. BigDecimal dayAve = new BigDecimal(0);
  1187. if (!dayResults.isEmpty()) {
  1188. dayAve = dayResults.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(24), 3, RoundingMode.HALF_UP);
  1189. }
  1190. map.put("dayShear", dayResults);
  1191. map.put("aveDayShear", dayAve);
  1192. /*年变化*/
  1193. for (int i = 1; i <= 12; i++) {
  1194. //过滤时间区间集合
  1195. List<WindTowerCalculationData> filterList = new ArrayList<>();
  1196. BigDecimal yearShear = new BigDecimal(0);
  1197. int finalI = i;
  1198. filterList = windTowerCalculationDataList.stream().filter(w -> sdf.format(w.getTime()).equals(String.valueOf(finalI))).collect(Collectors.toList());
  1199. if (!filterList.isEmpty()) {
  1200. List<BigDecimal> collect = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  1201. yearShear = collect.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(collect.size()), 3, RoundingMode.HALF_UP);
  1202. }
  1203. yearResults.add(yearShear);
  1204. monthTimeList.add(i + "月");
  1205. }
  1206. BigDecimal aveYearShear = new BigDecimal(0);
  1207. List<BigDecimal> collect = yearResults.stream().filter(w -> w.compareTo(new BigDecimal(0)) != 0).collect(Collectors.toList());
  1208. if (!collect.isEmpty()) {
  1209. aveYearShear = collect.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(collect.size()), 3, RoundingMode.HALF_UP);
  1210. }
  1211. map.put("monthTime", monthTimeList);
  1212. map.put("yearShear", yearResults);
  1213. map.put("aveYearShear", aveYearShear);
  1214. }
  1215. }
  1216. } catch (Exception e) {
  1217. e.printStackTrace();
  1218. }
  1219. return map;
  1220. }
  1221. /**
  1222. * 湍流曲线
  1223. *
  1224. * @param height 层高
  1225. * @return
  1226. * @throws Exception
  1227. */
  1228. public List<List<BigDecimal>> getTurIntensityCharts(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, String height) {
  1229. List<List<BigDecimal>> list = new ArrayList<>();
  1230. try {
  1231. BigDecimal ws;//风速值
  1232. BigDecimal sta;//风速标准差
  1233. BigDecimal turInsity = new BigDecimal(0);//湍流值
  1234. String wsFieldName = height + "awsDay";
  1235. List<EquipmentAttribute> wsDayAttList = equipmentAttributeList.stream().filter(e -> "wsDay".equals(e.getAttributeFunction())).collect(Collectors.toList());
  1236. // 过滤属性集合找对应的属性id
  1237. List<EquipmentAttribute> wsDayAtt = wsDayAttList.stream().filter(w -> w.getFieldName().equals(wsFieldName)).collect(Collectors.toList());
  1238. String wsEbId = wsDayAtt.get(0).getId();
  1239. //height层高的平均风速
  1240. List<WindTowerCalculationData> wsList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wsEbId)).collect(Collectors.toList());
  1241. //取出heigth层高的平均风速标差属性
  1242. List<EquipmentAttribute> equipmentAttributeList1 = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "staDay")).collect(Collectors.toList());
  1243. //取出这个层高所有的数据
  1244. List<WindTowerCalculationData> staList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(equipmentAttributeList1.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1245. /*风速段-----方差数组*/
  1246. Map<BigDecimal, List<BigDecimal>> turbulenceMap = new HashMap<>();
  1247. BigDecimal speedLevel;
  1248. for (int i = 0; i < wsList.size(); i++) {
  1249. try {
  1250. ws = wsList.get(i).getValue();
  1251. if (i >= staList.size()) {
  1252. break;
  1253. } else {
  1254. sta = staList.get(i).getValue();
  1255. }
  1256. turInsity = sta.divide(ws, 2, RoundingMode.HALF_UP);
  1257. //风速段
  1258. speedLevel = BigDecimal.valueOf(Math.ceil(ws.subtract(BigDecimal.valueOf(0.5)).doubleValue()));
  1259. if (turbulenceMap.containsKey((speedLevel))) {
  1260. turbulenceMap.get(speedLevel).add(turInsity);
  1261. } else {
  1262. turbulenceMap.put(speedLevel, new ArrayList<>());
  1263. turbulenceMap.get(speedLevel.setScale(1, RoundingMode.HALF_UP)).add(turInsity);
  1264. }
  1265. } catch (IndexOutOfBoundsException e) {
  1266. log.error("PDF 湍流曲线计算异常:" + e);
  1267. }
  1268. }
  1269. //利用treeMap排序
  1270. HashMap<BigDecimal, List<BigDecimal>> turbulenceTreeMap = new HashMap<>(turbulenceMap);
  1271. turbulenceTreeMap.forEach((key, val) -> {
  1272. List<BigDecimal> tempList = new ArrayList<>();
  1273. BigDecimal turbulence = val.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(val.size()), 3, RoundingMode.HALF_UP);
  1274. tempList.add(key.setScale(0, RoundingMode.HALF_UP));
  1275. tempList.add(turbulence);
  1276. list.add(tempList);
  1277. });
  1278. } catch (Exception e) {
  1279. e.printStackTrace();
  1280. }
  1281. return list;
  1282. }
  1283. /**
  1284. * 湍流日/年变化
  1285. *
  1286. * @return
  1287. * @throws Exception
  1288. */
  1289. public Map<String, Object> getTurIntensity(List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, String height) {
  1290. Map<String, Object> map = new HashMap<>();
  1291. try {
  1292. List<BigDecimal> dayResults = new ArrayList<>();//日变化
  1293. List<BigDecimal> yearResults = new ArrayList<>();//年变化
  1294. List<String> monthTimeList = new ArrayList<>();
  1295. SimpleDateFormat sdf = new SimpleDateFormat("M");
  1296. String wsFieldName = height + "turbulenceMonth";
  1297. String turFieldName = height + "turDayForMonth";
  1298. //height层高月平均湍流属性
  1299. List<EquipmentAttribute> turbulenceMonth = equipmentAttributeList.stream().filter(e -> wsFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  1300. //height层高 月逐时湍流属性
  1301. List<EquipmentAttribute> turbulenceHourForMonth = equipmentAttributeList.stream().filter(e -> turFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  1302. //height层高的月平均湍流集合
  1303. List<WindTowerCalculationData> turbulenceList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(turbulenceMonth.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1304. //height层高的月逐时湍流集合
  1305. List<WindTowerCalculationData> turbulenceHourForMonthList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(turbulenceHourForMonth.get(0).getId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1306. /*日变化*/
  1307. if (!turbulenceHourForMonthList.isEmpty()) {
  1308. dayResults = CalculationUtil.getData24(turbulenceHourForMonthList);
  1309. }
  1310. BigDecimal aveDayTurInsity = new BigDecimal(0);
  1311. aveDayTurInsity = dayResults.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(24), 2, RoundingMode.HALF_UP);
  1312. map.put("dayTurInsity", dayResults);
  1313. map.put("aveDayTurInsity", aveDayTurInsity);
  1314. /*年变化*/
  1315. // for (WindTowerCalculationData w : turbulenceList) {
  1316. // yearResults.add(w.getValue());
  1317. // monthTimeList.add(sdf.format(w.getTime()));
  1318. // }
  1319. for (int i = 1; i <= 12; i++) {
  1320. // Date monthStartTime = DateTimeUtil.getDayStartTime(DateTimeUtil.mouthOneDay(i).getTime());
  1321. //过滤时间区间集合
  1322. List<WindTowerCalculationData> filterList = new ArrayList<>();
  1323. BigDecimal value = new BigDecimal(0);
  1324. int finalI = i;
  1325. filterList = turbulenceList.stream().filter(w -> sdf.format(w.getTime()).equals(String.valueOf(finalI))).collect(Collectors.toList());
  1326. if (!filterList.isEmpty()) {
  1327. value = filterList.get(0).getValue();
  1328. }
  1329. yearResults.add(value);
  1330. monthTimeList.add(i + "月");
  1331. }
  1332. BigDecimal aveYearTurInsity = new BigDecimal(0);
  1333. //过滤为0的数据
  1334. List<BigDecimal> collect = yearResults.stream().filter(w -> w.compareTo(new BigDecimal(0)) != 0).collect(Collectors.toList());
  1335. if (collect.size() > 0) {
  1336. aveYearTurInsity = collect.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP);
  1337. }
  1338. map.put("yearTurInsity", yearResults);
  1339. map.put("aveYearTurInsity", aveYearTurInsity);
  1340. map.put("monthTime", monthTimeList);
  1341. } catch (Exception e) {
  1342. e.printStackTrace();
  1343. }
  1344. return map;
  1345. }
  1346. /**
  1347. * 获取湍流(风向玫瑰图)
  1348. *
  1349. * @param height
  1350. */
  1351. public Map<String, Object> getTurIntensityRose(List<WindDirectionStatisticsData> windDirectionStatisticsData, List<EquipmentAttribute> equipmentAttributeList, WindTowerInfo windTowerInfo, String height) {
  1352. Map<String, Object> map = new HashMap<>();
  1353. try {
  1354. // 若层高包含A按照去掉A的层高计算
  1355. if (height.contains("A")) {
  1356. height = height.substring(0, height.length() - 1);
  1357. }
  1358. List<Map<String, Object>> list = new ArrayList<>();
  1359. String turFieldName = height + "monthTurRose";
  1360. // 过滤获取ebId
  1361. List<EquipmentAttribute> turEquipmentAttribute = equipmentAttributeList.stream().filter(e -> turFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  1362. // 获取风向统计数据
  1363. List<WindDirectionStatisticsData> turList = windDirectionStatisticsData.stream().filter(e -> e.getEbId().equals(turEquipmentAttribute.get(0).getId())).collect(Collectors.toList());
  1364. for (WindDirectionEnum value : WindDirectionEnum.values()) {
  1365. Map<String, Object> roseMap = new HashMap<>();
  1366. // 根据风向过滤统计表
  1367. List<WindDirectionStatisticsData> filterTurList = turList.stream().filter(e -> e.getDirection().equals(value.name())).collect(Collectors.toList());
  1368. // 提取过滤的value值
  1369. List<BigDecimal> filterTurValueList = filterTurList.stream().map(WindDirectionStatisticsData::getValue).filter(w -> w != null).collect(Collectors.toList());
  1370. // 累加保留两位小数
  1371. BigDecimal sumtur = null;
  1372. if (!filterTurValueList.isEmpty()) {
  1373. sumtur = filterTurValueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
  1374. }
  1375. roseMap.put(value.name(), sumtur);
  1376. list.add(roseMap);
  1377. }
  1378. List<Map<String, Object>> aveTurbulenceIntensity;
  1379. aveTurbulenceIntensity = getAveTurbulenceIntensity(windDirectionStatisticsData, equipmentAttributeList, windTowerInfo);
  1380. map.put("turIntensity", list);
  1381. map.put("aveTurIntensity", aveTurbulenceIntensity);
  1382. } catch (Exception e) {
  1383. e.printStackTrace();
  1384. }
  1385. return map;
  1386. }
  1387. /**
  1388. * 获取所有层高的平均湍流(风向玫瑰图)
  1389. */
  1390. public List<Map<String, Object>> getAveTurbulenceIntensity(List<WindDirectionStatisticsData> windDirectionStatisticsData, List<EquipmentAttribute> equipmentAttributeList, WindTowerInfo windTowerInfo) {
  1391. String heights;
  1392. heights = windTowerInfo.getWdHeights();
  1393. if (heights == null || heights.equals("")) {
  1394. heights = "10,30,50,60,70,80,90,100,110,120,140,150";
  1395. }
  1396. String[] heightAll = heights.split(",");
  1397. BigDecimal zero = new BigDecimal(0);
  1398. List<Map<String, Object>> list = new ArrayList<>();
  1399. for (WindDirectionEnum value : WindDirectionEnum.values()) {
  1400. Map<String, Object> map = new HashMap<>();
  1401. List<BigDecimal> dataList = new ArrayList<>();
  1402. // 累加保留两位小数
  1403. BigDecimal sumtur = zero;
  1404. BigDecimal sumCount = zero;
  1405. BigDecimal aveTur = zero;
  1406. for (String height : heightAll) {
  1407. String turFieldName = height + "monthTurRose";
  1408. // 过滤获取ebId
  1409. List<EquipmentAttribute> turEquipmentAttribute = equipmentAttributeList.stream().filter(e -> turFieldName.equals(e.getFieldName())).collect(Collectors.toList());
  1410. // 获取风向统计数据
  1411. List<WindDirectionStatisticsData> turList = windDirectionStatisticsData.stream().filter(e -> e.getEbId().equals(turEquipmentAttribute.get(0).getId()) && e.getDirection().equals(value.name())).collect(Collectors.toList());
  1412. // 提取过滤的value值
  1413. List<BigDecimal> filterTurValueList = turList.stream().map(WindDirectionStatisticsData::getValue).filter(w -> w != null).collect(Collectors.toList());
  1414. if (!filterTurValueList.isEmpty()) {
  1415. sumtur = sumtur.add(filterTurValueList.stream().reduce(BigDecimal.ZERO, BigDecimal::add));
  1416. sumCount = sumCount.add(BigDecimal.valueOf(filterTurValueList.size()));
  1417. }
  1418. }
  1419. if (sumCount.compareTo(zero) != 0 && sumtur.compareTo(zero) != 0) {
  1420. aveTur = sumtur.divide(sumCount, 2, RoundingMode.HALF_UP);
  1421. }
  1422. map.put(value.name(), aveTur);
  1423. list.add(map);
  1424. }
  1425. return list;
  1426. }
  1427. /**
  1428. * 封装逐小时数据集合
  1429. *
  1430. * @param awsList 数据
  1431. * @return
  1432. */
  1433. public List<BigDecimal> getData24(List<WindTowerCalculationData> awsList) {
  1434. long hour = 3600000L;
  1435. Date systemDate = new Date();
  1436. List<BigDecimal> results = new ArrayList<>();
  1437. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
  1438. //获取昨日开始和结束时间
  1439. long startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(systemDate, -1).getTime());
  1440. long endTime = startTime + 86399000;
  1441. for (long time = startTime; time <= endTime; time += hour) {
  1442. Long finalTime = time;
  1443. String format = simpleDateFormat.format(finalTime);
  1444. List<BigDecimal> collect = awsList.stream().filter(s -> simpleDateFormat.format(s.getTime())
  1445. .equals(format) && s.getValue().compareTo(new BigDecimal(-99)) != 0)
  1446. .map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  1447. BigDecimal avg = collect.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP);
  1448. results.add(avg);
  1449. }
  1450. return results;
  1451. }
  1452. }