WindTowerCalculationDataServiceImpl.java 153 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799
  1. package com.jiayue.biz.service.impl;
  2. import cn.hutool.core.convert.Convert;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.jiayue.biz.conf.RequestDataHelper;
  8. import com.jiayue.biz.domain.*;
  9. import com.jiayue.biz.dto.SpeedAndDensityDto;
  10. import com.jiayue.biz.mapper.WindTowerCalculationDataMapper;
  11. import com.jiayue.biz.service.EquipmentAttributeService;
  12. import com.jiayue.biz.service.WindTowerCalculationDataService;
  13. import com.jiayue.biz.service.WindTowerInfoService;
  14. import com.jiayue.biz.util.CalculationUtil;
  15. import com.jiayue.biz.util.DateTimeUtil;
  16. import com.jiayue.biz.util.SEDateUtil;
  17. import com.jiayue.common.utils.DateUtil;
  18. import flanagan.analysis.ProbabilityPlot;
  19. import lombok.AllArgsConstructor;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import java.math.BigDecimal;
  24. import java.math.RoundingMode;
  25. import java.text.ParseException;
  26. import java.text.SimpleDateFormat;
  27. import java.util.*;
  28. import java.util.stream.Collectors;
  29. /**
  30. * 统计数据实现类
  31. *
  32. * @author zy
  33. * @date 2022-08-26
  34. */
  35. @Slf4j
  36. @Service
  37. @AllArgsConstructor
  38. public class WindTowerCalculationDataServiceImpl extends ServiceImpl<WindTowerCalculationDataMapper, WindTowerCalculationData> implements WindTowerCalculationDataService {
  39. //风功率密度和平均风速的统一标识
  40. private final String attributeFunction = "WindPowerDensity";
  41. private final String shearFunction = "shear";
  42. private final String turbulenceFunction = "turbulence";
  43. private final String wsFunction = "ws";
  44. private final String wsDayFunction = "wsDay";
  45. private final String wsMonthFunction = "wsMonth";
  46. private final String wpdFunction = "WindPowerDensity";
  47. private final String wsMaxMonthFunction = "maxWsMonth";
  48. private final String turbulenceDay = "turbulenceDay";
  49. private final String staDay = "staDay";
  50. private final String windShearFiledName = "windShear";
  51. private final String windShearDayFiledName = "windShearDay";
  52. //风切变计算指数
  53. private final BigDecimal lg30 = new BigDecimal("0.47712125471966244");//lg(30/10)
  54. private final BigDecimal lg50 = new BigDecimal("0.6989700043360189");//lg(50/10)
  55. private final BigDecimal lg60 = new BigDecimal("0.7781512503836436");//lg(60/10)
  56. private final BigDecimal lg70 = new BigDecimal("0.8450980400142568");//lg(70/10)
  57. private final BigDecimal lg80 = new BigDecimal("0.9030899869919435");//lg(80/10)
  58. private final BigDecimal lg90 = new BigDecimal("0.9542425094393249");//lg(90/10)
  59. private final BigDecimal lg100 = new BigDecimal("1.0");//lg(100/10)
  60. private final BigDecimal lg110 = new BigDecimal("1.0413926851582251");//lg(110/10)
  61. private final BigDecimal lg120 = new BigDecimal("1.0791812460476249");//lg(120/10)
  62. private final BigDecimal lg140 = new BigDecimal("1.146128035678238");//lg(140/10)
  63. private final BigDecimal lg150 = new BigDecimal("1.1760912590556813");//lg(150/10)
  64. private final WindTowerInfoService windTowerInfoService;
  65. private final EquipmentAttributeService equipmentAttributeService;
  66. // @Scheduled(cron = "0 0 2 1/1 * ? ")
  67. // @Scheduled(cron = "0 0 2 1/1 * ? ")
  68. /**
  69. * 风功率密度和平均风速计算方法
  70. */
  71. public ArrayList<WindTowerCalculationData> calculateWindPowerDensity(Long startTime, Long endTime, String eqNo, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<ProphaseWeatherData> prophaseWeatherDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerCalculationData> windTowerCalculationDataList) {
  72. //获取对应测风塔数据
  73. List<ProphaseAnemometryData> anemometryDataList = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime && p.getTs().getTime() <= endTime && p.getWsAve() != null && p.getWsAve() != -99).collect(Collectors.toList());
  74. List<ProphaseWeatherData> weatherDataList = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startTime && p.getTs().getTime() <= endTime && p.getAirDensity() != null && p.getAirDensity() >= 0).collect(Collectors.toList());
  75. long hour = 3600000L;
  76. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqNo).list();
  77. String[] height = windTowerInfos.get(0).getHeights().split(",");
  78. //定义数据空集合用来装载 结果数据
  79. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  80. try {
  81. //遍历出过滤出的平均风速属性
  82. for (String h : height) {
  83. EquipmentAttribute equipmentAttributeAws = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(h + "aws")).collect(Collectors.toList()).get(0);
  84. EquipmentAttribute equipmentAttributeWpd = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(h + "wpd")).collect(Collectors.toList()).get(0);
  85. //删除时间段所有数据
  86. removeByStartTimeBetweenAndEquipmentIdAndEbId(new Date(startTime), new Date(endTime), eqNo, equipmentAttributeAws.getId());
  87. removeByStartTimeBetweenAndEquipmentIdAndEbId(new Date(startTime), new Date(endTime), eqNo, equipmentAttributeWpd.getId());
  88. //遍历24小时,用来计算逐小时数据
  89. for (long time = startTime; time <= endTime; time += hour) {
  90. //过滤出对应测风塔数据
  91. long finalTime = time;
  92. //风数据过滤
  93. List<ProphaseAnemometryData> anemometryData = anemometryDataList.stream().filter(w -> w.getTs().getTime() >= finalTime && w.getTs().getTime() <= finalTime + hour - 1000 && w.getLayerHeight().equals(h)).collect(Collectors.toList());
  94. //环境数据过滤
  95. List<ProphaseWeatherData> weatherData = weatherDataList.stream().filter(w -> w.getTs().getTime() >= finalTime && w.getTs().getTime() <= finalTime + hour - 1000).collect(Collectors.toList());
  96. //根据层高获取所有风速数据
  97. List<BigDecimal> bigDecimals = anemometryData.stream().map((ProphaseAnemometryData p) -> {
  98. if (p.getWsAve() != null) {
  99. return BigDecimal.valueOf(p.getWsAve());
  100. }
  101. return BigDecimal.ZERO;
  102. }).collect(Collectors.toList());
  103. //风速数据时所有计算的根本,无数据不计算
  104. if (!bigDecimals.isEmpty()) {
  105. //计算平均风速和风功率密度到数据对象中
  106. if (bigDecimals.get(0) == null) {
  107. continue;
  108. }
  109. SpeedAndDensityDto speedAndDensityDto = getSpeedAndDensityDto(bigDecimals, anemometryData, weatherData);
  110. //保存风速
  111. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  112. windTowerCalculationData.setTime(new Date(time));
  113. windTowerCalculationData.setEbId(equipmentAttributeAws.getId());
  114. windTowerCalculationData.setEquipmentId(eqNo);
  115. windTowerCalculationData.setValue(speedAndDensityDto.getWindSpeed());
  116. windTowerCalculationDataList.add(windTowerCalculationData);
  117. list.add(windTowerCalculationData);
  118. //保存风功率密度
  119. if (speedAndDensityDto.getWindPowerDensity().compareTo(BigDecimal.ZERO) != 0) {
  120. WindTowerCalculationData windTowerCalculationDataWpd = new WindTowerCalculationData();
  121. windTowerCalculationDataWpd.setTime(new Date(time));
  122. windTowerCalculationDataWpd.setEbId(equipmentAttributeWpd.getId());
  123. windTowerCalculationDataWpd.setEquipmentId(eqNo);
  124. windTowerCalculationDataWpd.setValue(speedAndDensityDto.getWindPowerDensity());
  125. windTowerCalculationDataList.add(windTowerCalculationDataWpd);
  126. list.add(windTowerCalculationDataWpd);
  127. }
  128. }
  129. }
  130. }
  131. } catch (Exception e) {
  132. log.error("计算{}设备平均风速和风功率密度失败^ ^", eqNo);
  133. e.printStackTrace();
  134. }
  135. //保存
  136. // saveBatchByEquipmentId(list, eqNo);
  137. if (list.size() > 0) {
  138. log.info("平均风速和风功率密度成功^ ^");
  139. }
  140. return list;
  141. }
  142. /**
  143. * 获取风况数据(平均风速,风功率密度)
  144. *
  145. * @param bigDecimalList 风速数据
  146. * @return
  147. */
  148. public SpeedAndDensityDto getSpeedAndDensityDto(List<BigDecimal> bigDecimalList, List<ProphaseAnemometryData> anemometryData, List<ProphaseWeatherData> weatherData) {
  149. SpeedAndDensityDto speedAndDensityDto = new SpeedAndDensityDto();
  150. speedAndDensityDto.setWindSpeed(windSpeed(bigDecimalList));
  151. speedAndDensityDto.setWindPowerDensity(CalculationUtil.windEnergyDensity(anemometryData, weatherData));
  152. return speedAndDensityDto;
  153. }
  154. /**
  155. * 计算平均风速
  156. *
  157. * @param bigDecimalList 风速数据
  158. * @return
  159. */
  160. public BigDecimal windSpeed(List<BigDecimal> bigDecimalList) {
  161. return BigDecimal.valueOf(bigDecimalList.stream().collect(Collectors.averagingDouble(BigDecimal::doubleValue)));
  162. }
  163. //计算日发电量与满发小时数
  164. public ArrayList<WindTowerCalculationData> calculateBattery(Long startTime, Long endTime, WindTowerInfo windTowerInfo, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerCalculationData> windTowerCalculationDataList) {
  165. long day = 86400000L;
  166. ArrayList<WindTowerCalculationData> batteryList = new ArrayList<>();
  167. List<EquipmentAttribute> batteryDay = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals("batteryDay")).collect(Collectors.toList());
  168. //获取最高层高
  169. String maxHeight = CalculationUtil.getNumberFromString(Arrays.asList(windTowerInfo.getHeights().split(",")).get(0));
  170. this.removeByStartTimeBetweenAndEquipmentIdAndEbId(new Date(startTime), new Date(endTime), windTowerInfo.getEquipmentNo(), batteryDay.get(0).getId());
  171. for (long time = startTime; time < endTime; time += day) {
  172. long finalTime = time;
  173. BigDecimal batterySum = prophaseAnemometryDataList.stream().filter(p -> p.getLayerHeight().equals(maxHeight) && p.getWsAve() != null && p.getTs().getTime() >= finalTime && p.getTs().getTime() < finalTime + day)
  174. .map(p -> CalculationUtil.getBattery(BigDecimal.valueOf(p.getWsAve()))).reduce(BigDecimal.ZERO, BigDecimal::add);
  175. //日发电量
  176. if (batterySum.compareTo(BigDecimal.ZERO) != 0) {
  177. batterySum = batterySum.divide(BigDecimal.valueOf(6 * 1000), 2, RoundingMode.HALF_UP);
  178. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  179. windTowerCalculationData.setValue(batterySum);
  180. windTowerCalculationData.setEbId(batteryDay.get(0).getId());
  181. windTowerCalculationData.setTime(DateUtil.beginOfDay(new Date(time)));
  182. windTowerCalculationData.setEquipmentId(windTowerInfo.getEquipmentNo());
  183. batteryList.add(windTowerCalculationData);
  184. windTowerCalculationDataList.add(windTowerCalculationData);
  185. }
  186. }
  187. return batteryList;
  188. }
  189. /**
  190. * 空气密度曲线图
  191. *
  192. * @param startTime 开始时间
  193. * @param endTime 结束时间
  194. * @param equipmentId 设备编号
  195. * @param uid 年月区分id
  196. * @return
  197. */
  198. public List<Object> getAirDensity(Long startTime, Long endTime, String equipmentId, String uid) {
  199. ArrayList<Object> onlyData = new ArrayList<>();
  200. ArrayList<Object> list = new ArrayList<>();
  201. SimpleDateFormat day = new SimpleDateFormat("dd");
  202. SimpleDateFormat dayForYear = new SimpleDateFormat("yyyy-MM");
  203. // 若当天时间为每个月一号, 结束时间为上个月得月末时间
  204. if (day.format(new Date()).equals("01") && dayForYear.format(new Date()).equals(dayForYear.format(new Date(endTime)))) {
  205. endTime = DateTimeUtil.getDayLastTime(DateTimeUtil.mouthLastDay(1).getTime()).getTime();
  206. } else {
  207. // 若当天时间不为每个月一号,结束时间为本月的当前时间-1(昨天)
  208. // long yesterday = new Date().getTime() - 1000 * 60 * 60 * 24;//昨天
  209. endTime = DateTimeUtil.endOfMonth(new Date(endTime)).getTime();
  210. }
  211. if (uid.equals("1")) {
  212. String airDensityFieldName = "airDensity";
  213. List<EquipmentAttribute> airDayFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, airDensityFieldName).list();
  214. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  215. if (!airDayFieldNameList.isEmpty()) {
  216. String airDayEbId = airDayFieldNameList.get(0).getId();
  217. //开始时间
  218. Date startTimeOfCurrentMonth = SEDateUtil.getStartTimeOfCurrentDay(new Date(startTime));
  219. //结束时间
  220. // Date endTimeOfCurrentMonth = SEDateUtil.getEndTimeOfCurrentDay(new Date(endTime - 1));
  221. //获取所有空气密度数据
  222. List<WindTowerCalculationData> airDayList = getByStartTimeBetweenAndEquipmentIdAndEbId(startTimeOfCurrentMonth, new Date(endTime), equipmentId, airDayEbId);
  223. airDayList = airDayList.stream().sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  224. //平均空气密度的总和
  225. BigDecimal airAveSum = BigDecimal.ZERO;
  226. for (WindTowerCalculationData w : airDayList) {
  227. HashMap<Object, Object> airDayMap = new HashMap<>();
  228. airAveSum = airAveSum.add(w.getValue());
  229. String format = sdf.format(w.getTime());
  230. airDayMap.put("time", format);
  231. airDayMap.put("air", w.getValue());
  232. list.add(airDayMap);
  233. }
  234. HashMap<Object, Object> aveAirMap = new HashMap<>();
  235. if (!airDayList.isEmpty()) {
  236. aveAirMap.put("ave", airAveSum.divide(BigDecimal.valueOf(airDayList.size()), 2, RoundingMode.HALF_UP));
  237. }
  238. onlyData.add(list);
  239. onlyData.add(aveAirMap);
  240. }
  241. }
  242. if (uid.equals("2")) {
  243. //设置年份用的
  244. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  245. //给前端用的日期格式
  246. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
  247. //获取查询的年份
  248. int toYear = Integer.parseInt(sdf.format(startTime));
  249. int toYear2 = Integer.parseInt(sdf.format(endTime));
  250. Calendar calendar = Calendar.getInstance();
  251. calendar.clear();
  252. calendar.set(Calendar.YEAR, toYear);
  253. //当前年的开始时间
  254. long startHour = calendar.getTimeInMillis();
  255. //当前年的结束时间
  256. calendar.clear();
  257. calendar.set(Calendar.YEAR, toYear2);
  258. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  259. long endHour = calendar.getTimeInMillis() - 1l;
  260. String airDensityFieldName = "airDensityMonth";
  261. List<EquipmentAttribute> turDayFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, airDensityFieldName).list();
  262. if (!turDayFieldNameList.isEmpty()) {
  263. String airMonthEbId = turDayFieldNameList.get(0).getId();
  264. //开始时间
  265. Date startTimeOfCurrentMonth = SEDateUtil.getStartTimeOfCurrentDay(new Date(startHour));
  266. //结束时间
  267. Date endTimeOfCurrentMonth = SEDateUtil.getEndTimeOfCurrentDay(new Date(endHour));
  268. List<WindTowerCalculationData> airMonthList = getByStartTimeBetweenAndEquipmentIdAndEbId(startTimeOfCurrentMonth, endTimeOfCurrentMonth, equipmentId, airMonthEbId);
  269. airMonthList = airMonthList.stream().sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  270. BigDecimal airAveSum = BigDecimal.ZERO;
  271. for (WindTowerCalculationData w : airMonthList) {
  272. HashMap<Object, Object> airMonthMap = new HashMap<>();
  273. airAveSum = airAveSum.add(w.getValue());
  274. String format = sdf1.format(w.getTime());
  275. airMonthMap.put("time", format);
  276. airMonthMap.put("air", w.getValue());
  277. list.add(airMonthMap);
  278. }
  279. HashMap<Object, Object> aveAirMap = new HashMap<>();
  280. if (!airMonthList.isEmpty()) {
  281. aveAirMap.put("ave", airAveSum.divide(BigDecimal.valueOf(airMonthList.size()), 2, RoundingMode.HALF_UP));
  282. }
  283. onlyData.add(list);
  284. onlyData.add(aveAirMap);
  285. }
  286. }
  287. return onlyData;
  288. }
  289. /**
  290. * Gumbel分布概率
  291. *
  292. * @param startTime
  293. * @param endTime
  294. * @param eqId
  295. * @return
  296. */
  297. public List<Object> getGumbel(Long startTime, Long endTime, String eqId, String height) {
  298. //最终返回的集合
  299. ArrayList<Object> gumbelList = new ArrayList<>();
  300. //开始时间
  301. Date startTimeOfCurrentMonth = SEDateUtil.getStartTimeOfCurrentDay(new Date(startTime));
  302. //结束时间
  303. Date endTimeOfCurrentMonth = SEDateUtil.getEndTimeOfCurrentDay(new Date(endTime));
  304. //获取EquipmentAttribute表中的对应数据
  305. if (height == null || height.equals("")) {
  306. height = "80";
  307. }
  308. String[] heightAll = height.split(",");
  309. List<EquipmentAttribute> equipmentAttributeList1 = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getAttributeFunction, "maxWsMonth").list();
  310. List<WindTowerCalculationData> windTowerCalculationDataList1 = getByBetweenTimeAndEquipmentId(startTimeOfCurrentMonth, endTimeOfCurrentMonth, eqId);
  311. for (String h : heightAll) {
  312. //获取层高
  313. String heightGumbel = h + "maxwsMonth";
  314. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeList1.stream().filter(w -> w.getFieldName().equals(heightGumbel)).collect(Collectors.toList());
  315. //获取对应的数据
  316. List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(equipmentAttributeList.get(0).getId()) && w.getEquipmentId().equals(eqId) &&
  317. w.getTime().after(startTimeOfCurrentMonth) && w.getTime().before(endTimeOfCurrentMonth)).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  318. //准备放入Gumbel算法的集合
  319. ArrayList<Object> list = new ArrayList<>();
  320. for (WindTowerCalculationData windTowerCalculationData : windTowerCalculationDataList) {
  321. list.add(windTowerCalculationData.getValue().doubleValue());
  322. }
  323. if (list.size() > 5) {
  324. //把查询的最大风速集合放入公式
  325. ProbabilityPlot probabilityPlot = new ProbabilityPlot(list);
  326. probabilityPlot.suppressDisplay();
  327. //尺度参数 β
  328. double v = probabilityPlot.gumbelMaxSigma();
  329. //位置参数 α
  330. double u = probabilityPlot.gumbelMaxMu();
  331. TreeMap<BigDecimal, BigDecimal> gumbelMap = new TreeMap<>();
  332. BigDecimal wsMax = BigDecimal.ZERO;
  333. for (WindTowerCalculationData w : windTowerCalculationDataList) {
  334. //最大风速值
  335. BigDecimal wsValue = w.getValue();
  336. //P(X)= exp {—exp[ -(X- α)/β]} 计算出在这个时间段的风速重现概率
  337. wsMax = BigDecimal.valueOf(Math.exp(-(Math.exp(-(w.getValue().doubleValue() - u) / v)))).setScale(2, RoundingMode.HALF_UP);
  338. //加入时间标识
  339. gumbelMap.put(wsValue, wsMax);
  340. }
  341. ArrayList<Object> list1 = new ArrayList<>();
  342. for (Map.Entry<BigDecimal, BigDecimal> g : gumbelMap.entrySet()) {
  343. HashMap<Object, Object> map = new HashMap<>();
  344. //风速
  345. map.put("wsMax", g.getKey());
  346. //概率
  347. map.put("gum", g.getValue());
  348. list1.add(map);
  349. }
  350. HashMap<String, Object> heightGumbelMap = new HashMap<>();
  351. heightGumbelMap.put(h, list1);
  352. //加入层高标识
  353. for (Map.Entry<String, Object> h1 : heightGumbelMap.entrySet()) {
  354. HashMap<Object, Object> map = new HashMap<>();
  355. map.put("height", h1.getKey());
  356. map.put("arr", h1.getValue());
  357. gumbelList.add(map);
  358. }
  359. }
  360. }
  361. return gumbelList;
  362. }
  363. /**
  364. * 湍流统计曲线图
  365. *
  366. * @param height 层高
  367. * @param eqId 设备编号
  368. * @return List<Object>
  369. */
  370. public List<Object> getTurbulence(Long startTime, Long endTime, String height, String eqId) {
  371. //最后返回的
  372. ArrayList<Object> onlyData = new ArrayList<>();
  373. //装所有风速数据
  374. ArrayList<Object> arrList = new ArrayList<>();
  375. //装平均值
  376. ArrayList<Object> list1 = new ArrayList<>();
  377. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  378. if (height == null || height.equals("")) {
  379. for (WindTowerInfo windTowerInfo : windTowerInfos) {
  380. height = windTowerInfo.getHeights();
  381. }
  382. }
  383. List<String> heightSort = new ArrayList<>();
  384. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
  385. String[] heightAll = height.split(",");
  386. for (String s : heightAll) {
  387. heightSort.add(s);
  388. }
  389. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getAttributeFunction, "turbulenceMonth").list();
  390. // 根据开始时间、结束时间、设备id查询统计表
  391. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  392. // 根据开始时间、结束时间分割的月份
  393. List<Long> timeList = DateTimeUtil.getIntervalTimeByMonth(new Date(startTime), new Date(endTime));
  394. for (String h : heightSort) {
  395. String turMonthFieldName = h + "turbulenceMonth";
  396. //存放数据
  397. // 获取EbId
  398. List<EquipmentAttribute> turDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(turMonthFieldName)).collect(Collectors.toList());
  399. if (!turDayFieldNameList.isEmpty()) {
  400. String turDayEbId = turDayFieldNameList.get(0).getId();
  401. //平均风速集合
  402. List<WindTowerCalculationData> turDayList = new ArrayList<>();
  403. // 根据属性id过滤统计表
  404. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(turDayEbId)).collect(Collectors.toList());
  405. ArrayList<Object> list = new ArrayList<>();
  406. BigDecimal turAve = BigDecimal.ZERO; // 平均湍流
  407. for (Long time : timeList) {
  408. turDayList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(time)) == 0).collect(Collectors.toList());
  409. BigDecimal value = BigDecimal.ZERO;
  410. if (!turDayList.isEmpty()) {
  411. value = turDayList.get(0).getValue();
  412. }
  413. HashMap<Object, Object> map = new HashMap<>();
  414. String format = sdf.format(time);
  415. map.put("tur", value.setScale(2, RoundingMode.HALF_UP));
  416. map.put("time", format);
  417. list.add(map);
  418. }
  419. // 曲线list
  420. Map<String, Object> finalMap = new HashMap<>();
  421. finalMap.put("height", h);
  422. finalMap.put("arr", list);
  423. arrList.add(finalMap);
  424. // 湍流数值集合
  425. List<BigDecimal> turList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  426. if (!turList.isEmpty()) {
  427. turAve = turList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(turList.size()), 2, RoundingMode.HALF_UP);
  428. }
  429. }
  430. }
  431. onlyData.add(arrList);
  432. onlyData.add(list1);
  433. return onlyData;
  434. }
  435. /**
  436. * 年资源统计(空气密度)
  437. *
  438. * @param startTime 开始时间
  439. * @param endTime 结束时间
  440. * @param eqId 设备编号
  441. * @return List<Object>
  442. */
  443. public List<Object> getDensityYear(Long startTime, Long endTime, String eqId) {
  444. String fieldName = "airDensityMonth";
  445. List<EquipmentAttribute> densityTypeList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, fieldName).list();
  446. String densityId = densityTypeList.get(0).getId();
  447. //设置年份用的
  448. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  449. //获取查询的年份
  450. int toYearStart = Integer.parseInt(sdf.format(startTime));
  451. int toYearEnd = Integer.parseInt(sdf.format(endTime));
  452. ArrayList<Object> PDataList = new ArrayList<>();
  453. for (int i = toYearStart; i <= toYearEnd; i++) {
  454. Calendar calendar = Calendar.getInstance();
  455. calendar.clear();
  456. calendar.set(Calendar.YEAR, i);
  457. //当前年的开始时间
  458. long startHour = calendar.getTimeInMillis();
  459. calendar.clear();
  460. calendar.set(Calendar.YEAR, i);
  461. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  462. //当前年的结束时间
  463. long endHour = calendar.getTimeInMillis() - 1l;
  464. //开始时间
  465. Date startTimeOfCurrentMonth = SEDateUtil.getStartTimeOfCurrentDay(new Date(startHour));
  466. //结束时间
  467. Date endTimeOfCurrentMonth = SEDateUtil.getEndTimeOfCurrentDay(new Date(endHour));
  468. List<WindTowerCalculationData> byBetweenTimeAndEquipmentId = getByBetweenTimeAndEquipmentId(startTimeOfCurrentMonth, endTimeOfCurrentMonth, eqId);
  469. List<WindTowerCalculationData> densityDataList = byBetweenTimeAndEquipmentId.stream().filter(w -> w.getEbId().equals(densityId)).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  470. BigDecimal pSum = BigDecimal.ZERO;
  471. for (WindTowerCalculationData w : densityDataList) {
  472. pSum = pSum.add(w.getValue());
  473. }
  474. HashMap<Object, Object> PTMap = new HashMap<>();
  475. if (!densityDataList.isEmpty()) {
  476. PTMap.put(i, pSum.divide(BigDecimal.valueOf(densityDataList.size()), 2, RoundingMode.HALF_UP));
  477. }
  478. for (Map.Entry<Object, Object> pt : PTMap.entrySet()) {
  479. HashMap<String, Object> map = new HashMap<>();
  480. map.put("time", pt.getKey());
  481. map.put("p", pt.getValue());
  482. PDataList.add(map);
  483. }
  484. }
  485. return PDataList;
  486. }
  487. /**
  488. * 年风资源统计(风速+风功率密度)
  489. *
  490. * @param startTime 开始年份
  491. * @param endTime 结束年份
  492. * @param height 层高
  493. * @param eqId 设备编号
  494. * @return List<Object>
  495. */
  496. public List<Object> getWindResources(Long startTime, Long endTime, String height, String eqId) {
  497. ArrayList<Object> DataList = new ArrayList<>();
  498. ArrayList<Object> DataOneList = new ArrayList<>();
  499. ArrayList<Object> DataTWOList = new ArrayList<>();
  500. Calendar calendar1 = Calendar.getInstance();
  501. calendar1.clear();
  502. calendar1.set(Calendar.YEAR, DateUtil.year(new Date(endTime)));
  503. calendar1.roll(Calendar.DAY_OF_YEAR, -1);
  504. //获取年份最后一天
  505. endTime = calendar1.getTime().getTime();
  506. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  507. if (height == null || height.equals("")) {
  508. height = windTowerInfos.get(0).getHeights();
  509. }
  510. //设置年份用的
  511. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  512. //获取查询的年份
  513. int toYearStart = Integer.parseInt(sdf.format(startTime));
  514. int toYearEnd = Integer.parseInt(sdf.format(endTime));
  515. List<String> heightSort = new ArrayList<>();
  516. String[] heightAll = height.split(",");
  517. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
  518. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  519. //遍历层高
  520. for (String h : heightAll) {
  521. //设置 层高+fieldName(数据库字段 50awsMonth)
  522. String fieldNameWs = h + "awsMonth";
  523. String fieldNameWpd = h + "wpdMonth";
  524. List<EquipmentAttribute> allWsFiledNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(fieldNameWs)).collect(Collectors.toList());
  525. List<EquipmentAttribute> allWpdFiledNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(fieldNameWpd)).collect(Collectors.toList());
  526. //存放最后数据的map 防止重复数据 new外面
  527. HashMap<Object, Object> map1 = new HashMap<>();
  528. HashMap<String, Object> HDMap = new HashMap<>();
  529. //年平均风速存放的list
  530. ArrayList<Object> list = new ArrayList<>();
  531. //年风功率密度存放的list
  532. ArrayList<Object> list1 = new ArrayList<>();
  533. for (int i = toYearStart; i <= toYearEnd; i++) {
  534. Calendar calendar = Calendar.getInstance();
  535. calendar.clear();
  536. calendar.set(Calendar.YEAR, i);
  537. //当前年的开始时间
  538. long startHour = calendar.getTimeInMillis();
  539. calendar.clear();
  540. calendar.set(Calendar.YEAR, i);
  541. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  542. //当前年的结束时间
  543. long endHour = calendar.getTimeInMillis() - 1L;
  544. //开始时间
  545. Date startTimeOfCurrentMonth = SEDateUtil.getStartTimeOfCurrentDay(new Date(startHour));
  546. //结束时间
  547. Date endTimeOfCurrentMonth = SEDateUtil.getEndTimeOfCurrentDay(new Date(endHour));
  548. if (!allWsFiledNameList.isEmpty()) {
  549. String awsMonthEqId = allWsFiledNameList.get(0).getId();
  550. List<WindTowerCalculationData> allDataWsList = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(eqId) && w.getEbId().equals(awsMonthEqId) &&
  551. w.getTime().after(startTimeOfCurrentMonth) && w.getTime().before(endTimeOfCurrentMonth)).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  552. BigDecimal wsYearData = BigDecimal.ZERO;
  553. for (WindTowerCalculationData ws : allDataWsList) {
  554. wsYearData = wsYearData.add(ws.getValue());
  555. }
  556. HashMap<Object, Object> wsMap = new HashMap<>();
  557. if (!allDataWsList.isEmpty()) {
  558. wsMap.put(i, wsYearData.divide(BigDecimal.valueOf(allDataWsList.size()), 2, RoundingMode.HALF_UP));
  559. }
  560. //给时间和年平均数值添加标识
  561. for (Map.Entry<Object, Object> ws1 : wsMap.entrySet()) {
  562. HashMap<Object, Object> map = new HashMap<>();
  563. map.put("time", ws1.getKey());
  564. map.put("ws", ws1.getValue());
  565. list.add(map);
  566. }
  567. HashMap<String, Object> heightDataMap = new HashMap<>();
  568. //放入层高
  569. heightDataMap.put(h, list);
  570. for (Map.Entry<String, Object> hd : heightDataMap.entrySet()) {
  571. map1 = new HashMap<>();
  572. map1.put("height", hd.getKey());
  573. map1.put("arr", hd.getValue());
  574. }
  575. }
  576. if (!allWpdFiledNameList.isEmpty()) {
  577. String wpdMonthEqId = allWpdFiledNameList.get(0).getId();
  578. List<WindTowerCalculationData> allDataWpdList = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(eqId) && w.getEbId().equals(wpdMonthEqId) &&
  579. w.getTime().after(startTimeOfCurrentMonth) && w.getTime().before(endTimeOfCurrentMonth)).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  580. BigDecimal wpdYearData = BigDecimal.ZERO;
  581. for (WindTowerCalculationData wpd : allDataWpdList) {
  582. wpdYearData = wpdYearData.add(wpd.getValue());
  583. }
  584. HashMap<Object, Object> wpdMap = new HashMap<>();
  585. //添加时间
  586. if (!allDataWpdList.isEmpty()) {
  587. wpdMap.put(i, wpdYearData.divide(BigDecimal.valueOf(allDataWpdList.size()), 2, RoundingMode.HALF_UP));
  588. }
  589. for (Map.Entry<Object, Object> wpd1 : wpdMap.entrySet()) {
  590. HashMap<Object, Object> map = new HashMap<>();
  591. map.put("time", wpd1.getKey());
  592. map.put("wpd", wpd1.getValue());
  593. list1.add(map);
  594. }
  595. HashMap<String, Object> heightDataMap = new HashMap<>();
  596. heightDataMap.put(h, list1);
  597. for (Map.Entry<String, Object> hd : heightDataMap.entrySet()) {
  598. HDMap = new HashMap<>();
  599. HDMap.put("height", hd.getKey());
  600. HDMap.put("arr", hd.getValue());
  601. }
  602. }
  603. }
  604. if (!map1.entrySet().isEmpty()) {
  605. DataOneList.add(map1);
  606. }
  607. if (!HDMap.entrySet().isEmpty()) {
  608. DataTWOList.add(HDMap);
  609. }
  610. }
  611. DataList.add(DataOneList);
  612. DataList.add(DataTWOList);
  613. return DataList;
  614. }
  615. /**
  616. * 时间段平均风速曲线图
  617. *
  618. * @param startTime 开始时间
  619. * @param endTime 结束时间
  620. * @param height 测高
  621. * @param eqId 设备编号
  622. * @return List<Object>
  623. */
  624. public List<Object> getWindSpeed(Long startTime, Long endTime, String height, String eqId, String uid) {
  625. //最后返回的
  626. ArrayList<Object> onlyData = new ArrayList<>();
  627. // endTime = endTime - 1L;
  628. // SimpleDateFormat day = new SimpleDateFormat("dd");
  629. // SimpleDateFormat dayForYear = new SimpleDateFormat("yyyy-MM");
  630. // 若当天时间为每个月一号, 结束时间为上个月得月末时间
  631. // if (day.format(new Date()).equals("01") && dayForYear.format(new Date()).equals(dayForYear.format(new Date(endTime)))) {
  632. // endTime = DateTimeUtil.getDayLastTime(DateTimeUtil.mouthLastDay(1).getTime()).getTime();
  633. // } else {
  634. // // 若当天时间不为每个月一号,结束时间为本月的当前时间-1(昨天)
  635. //// long yesterday = new Date().getTime() - 1000 * 60 * 60 * 24;//昨天
  636. // endTime = DateTimeUtil.endOfMonth(new Date(endTime)).getTime();
  637. // }
  638. //装所有风速数据
  639. ArrayList<Object> arrList = new ArrayList<>();
  640. BigDecimal minWs = BigDecimal.ZERO;
  641. BigDecimal maxWs = BigDecimal.ZERO;
  642. //装平均值
  643. ArrayList<Object> list1 = new ArrayList<>();
  644. ArrayList<Object> list2 = new ArrayList<>();
  645. ArrayList<Object> list3 = new ArrayList<>();
  646. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.lambdaQuery().like(EquipmentAttribute::getAttributeFunction, "ws").list();
  647. String[] heights = null;
  648. if (height == null || height.equals("")) {
  649. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  650. heights = windTowerInfos.get(0).getHeights().split(",");
  651. } else {
  652. heights = height.split(",");
  653. }
  654. List<String> heightList = Arrays.asList(heights);
  655. if (uid.equals("1")) {//月逐日
  656. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  657. // 根据时间升序
  658. windTowerCalculationDataList.sort(Comparator.comparing(WindTowerCalculationData::getTime));
  659. //遍历所有层高
  660. for (String h : heightList) {
  661. String awsDayFieldName = h + "awsDay";
  662. List<EquipmentAttribute> awsDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(awsDayFieldName)).collect(Collectors.toList());
  663. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  664. //存放数据
  665. if (!awsDayFieldNameList.isEmpty()) {
  666. String awsDayEbId = awsDayFieldNameList.get(0).getId();
  667. //平均风速集合
  668. List<WindTowerCalculationData> awsDayList = new ArrayList<>();
  669. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(awsDayEbId)).collect(Collectors.toList());
  670. BigDecimal awsAve = BigDecimal.ZERO;
  671. ArrayList<Object> list = new ArrayList<>();
  672. for (long i = startTime; i < endTime; i += 1000 * 60 * 60 * 24) {
  673. long finalI = i;
  674. awsDayList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(finalI)) == 0).collect(Collectors.toList());
  675. HashMap<Object, Object> map = new HashMap<>();
  676. String format = sdf.format(i);
  677. BigDecimal value = BigDecimal.ZERO;
  678. if (!awsDayList.isEmpty()) {
  679. value = awsDayList.get(0).getValue();
  680. }
  681. map.put("ws", value);
  682. map.put("time", format);
  683. list.add(map);
  684. }
  685. // 曲线
  686. HashMap<Object, Object> finalMap = new HashMap<>();
  687. finalMap.put("height", h);
  688. finalMap.put("arr", list);
  689. arrList.add(finalMap);
  690. //平均值
  691. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  692. if (!aveWsList.isEmpty()) {
  693. awsAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  694. }
  695. HashMap<Object, Object> finalAveMap = new HashMap<>();
  696. finalAveMap.put("height", h);
  697. finalAveMap.put("aws", awsAve);
  698. list1.add(finalAveMap);
  699. //最小值 最大值
  700. if (!filterList.isEmpty()) {
  701. minWs = filterList.stream().min(Comparator.comparing(WindTowerCalculationData::getValue)).get().getValue();
  702. maxWs = filterList.stream().max(Comparator.comparing(WindTowerCalculationData::getValue)).get().getValue();
  703. }
  704. HashMap<Object, Object> finalMinMap = new HashMap<>();
  705. finalMinMap.put("height2", h);
  706. finalMinMap.put("min", minWs);
  707. list2.add(finalMinMap);
  708. HashMap<Object, Object> finalMaxMap = new HashMap<>();
  709. finalMaxMap.put("height3", h);
  710. finalMaxMap.put("max", maxWs);
  711. list3.add(finalMaxMap);
  712. }
  713. }
  714. onlyData.add(arrList);
  715. onlyData.add(list1);
  716. onlyData.add(list2);
  717. onlyData.add(list3);
  718. }
  719. if (uid.equals("2")) {
  720. //设置年份用的
  721. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  722. //给前端用的日期格式
  723. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
  724. //获取查询的年份
  725. int toYear = Integer.parseInt(sdf.format(startTime));
  726. int toYear2 = Integer.parseInt(sdf.format(endTime));
  727. Calendar calendar = Calendar.getInstance();
  728. calendar.clear();
  729. calendar.set(Calendar.YEAR, toYear);
  730. //当前年的开始时间
  731. long startHour = calendar.getTimeInMillis();
  732. calendar.clear();
  733. calendar.set(Calendar.YEAR, toYear2);
  734. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  735. //当前年的结束时间
  736. endTime = endTime + 100l;
  737. // 根据开始时间、结束时间分割的月份
  738. List<Long> timeList = DateTimeUtil.getIntervalTimeByMonth(new Date(startHour), new Date(endTime));
  739. // 开始年和结束年相同 getIntervalTimeByMonth 最后一个月会重复两次
  740. if (toYear == toYear2) {
  741. timeList.remove(timeList.size() - 1);
  742. }
  743. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startHour), new Date(endTime), eqId);
  744. for (String h : heights) {
  745. String awsMonthFieldName = h + "awsMonth";
  746. //存放数据
  747. List<EquipmentAttribute> awsDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(awsMonthFieldName)).collect(Collectors.toList());
  748. if (!awsDayFieldNameList.isEmpty()) {
  749. String awsDayEbId = awsDayFieldNameList.get(0).getId();
  750. //平均风速集合
  751. List<WindTowerCalculationData> awsDayList = new ArrayList<>();
  752. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(awsDayEbId)).collect(Collectors.toList());
  753. BigDecimal awsAve = BigDecimal.ZERO;
  754. ArrayList<Object> list = new ArrayList<>();
  755. for (long time : timeList) {
  756. awsDayList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(time)) == 0).collect(Collectors.toList());
  757. HashMap<Object, Object> map = new HashMap<>();
  758. String format = sdf1.format(time);
  759. BigDecimal value = BigDecimal.ZERO;
  760. if (!awsDayList.isEmpty()) {
  761. value = awsDayList.get(0).getValue();
  762. }
  763. map.put("ws", value);
  764. map.put("time", format);
  765. list.add(map);
  766. }
  767. // 曲线
  768. HashMap<Object, Object> finalMap = new HashMap<>();
  769. finalMap.put("height", h);
  770. finalMap.put("arr", list);
  771. arrList.add(finalMap);
  772. //平均值
  773. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  774. if (!aveWsList.isEmpty()) {
  775. awsAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  776. }
  777. HashMap<Object, Object> finalAveMap = new HashMap<>();
  778. finalAveMap.put("height", h);
  779. finalAveMap.put("aws", awsAve);
  780. list1.add(finalAveMap);
  781. //最小值 最大值
  782. if (!filterList.isEmpty()) {
  783. minWs = filterList.stream().min(Comparator.comparing(WindTowerCalculationData::getValue)).get().getValue();
  784. maxWs = filterList.stream().max(Comparator.comparing(WindTowerCalculationData::getValue)).get().getValue();
  785. }
  786. HashMap<Object, Object> finalMinMap = new HashMap<>();
  787. finalMinMap.put("height2", h);
  788. finalMinMap.put("min", minWs);
  789. list2.add(finalMinMap);
  790. HashMap<Object, Object> finalMaxMap = new HashMap<>();
  791. finalMaxMap.put("height3", h);
  792. finalMaxMap.put("max", maxWs);
  793. list3.add(finalMaxMap);
  794. }
  795. }
  796. onlyData.add(arrList);
  797. onlyData.add(list1);
  798. onlyData.add(list2);
  799. onlyData.add(list3);
  800. }
  801. return onlyData;
  802. }
  803. /**
  804. * 时间段风功率密度曲线图(统计查询)
  805. *
  806. * @param startTime 开始时间
  807. * @param endTime 结束时间
  808. * @param height 测高
  809. * @param eqId 设备编号
  810. * @return List<Object>
  811. */
  812. public List<Object> getWpd(Long startTime, Long endTime, String height, String eqId, String uid) {
  813. //最后返回的
  814. ArrayList<Object> onlyData = new ArrayList<>();
  815. // endTime = endTime - 1L;
  816. // SimpleDateFormat day = new SimpleDateFormat("dd");
  817. // SimpleDateFormat dayForYear = new SimpleDateFormat("yyyy-MM");
  818. // // 若当天时间为每个月一号, 结束时间为上个月得月末时间
  819. // if (day.format(new Date()).equals("01") && dayForYear.format(new Date()).equals(dayForYear.format(new Date(endTime)))) {
  820. // endTime = DateTimeUtil.getDayLastTime(DateTimeUtil.mouthLastDay(1).getTime()).getTime();
  821. // } else {
  822. // // 若当天时间不为每个月一号,结束时间为本月的当前时间-1(昨天)
  823. //// long yesterday = new Date().getTime() - 1000 * 60 * 60 * 24;//昨天
  824. // endTime = DateTimeUtil.endOfMonth(new Date(endTime)).getTime();
  825. // }
  826. //装所有风功率密度数据
  827. ArrayList<Object> arrList = new ArrayList<>();
  828. //装平均值
  829. ArrayList<Object> list1 = new ArrayList<>();
  830. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  831. if (height == null || height.equals("")) {
  832. height = windTowerInfos.get(0).getHeights();
  833. }
  834. // List<String> heightSort = new ArrayList<>();
  835. String[] heightAll = height.split(",");
  836. // for (String s : heightAll) {
  837. // heightSort.add(s);
  838. // }
  839. // heightSort = heightSort.stream().sorted().collect(Collectors.toList());
  840. List<String> heightSort = Arrays.asList(heightAll);
  841. //查询统计属性表
  842. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getAttributeFunction, "WindPowerDensity").list();
  843. //查询统计数据表
  844. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  845. if (uid.equals("1")) {
  846. //遍历所有层高
  847. for (String h : heightSort) {
  848. String wpdDayFieldName = h + "wpdDay";
  849. List<EquipmentAttribute> wpdDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(wpdDayFieldName)).collect(Collectors.toList());
  850. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  851. //存放数据
  852. if (!wpdDayFieldNameList.isEmpty()) {
  853. String wpdDayEbId = wpdDayFieldNameList.get(0).getId();
  854. //平均风速集合
  855. List<WindTowerCalculationData> wpdDayList = new ArrayList<>();
  856. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wpdDayEbId)).collect(Collectors.toList());
  857. BigDecimal wpdAve = BigDecimal.ZERO;
  858. ArrayList<Object> list = new ArrayList<>();
  859. for (long i = startTime; i < endTime; i += 1000 * 60 * 60 * 24) {
  860. long finalI = i;
  861. wpdDayList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(finalI)) == 0).collect(Collectors.toList());
  862. HashMap<Object, Object> map = new HashMap<>();
  863. String format = sdf.format(i);
  864. BigDecimal value = BigDecimal.ZERO;
  865. if (!wpdDayList.isEmpty()) {
  866. value = wpdDayList.get(0).getValue();
  867. }
  868. map.put("wpd", value);
  869. map.put("time", format);
  870. list.add(map);
  871. }
  872. // 曲线
  873. HashMap<Object, Object> finalMap = new HashMap<>();
  874. finalMap.put("height", h);
  875. finalMap.put("arr", list);
  876. arrList.add(finalMap);
  877. //平均值
  878. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  879. if (!aveWsList.isEmpty()) {
  880. wpdAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  881. }
  882. HashMap<Object, Object> finalAveMap = new HashMap<>();
  883. finalAveMap.put("height", h);
  884. finalAveMap.put("wpdAve", wpdAve);
  885. list1.add(finalAveMap);
  886. }
  887. }
  888. onlyData.add(arrList);
  889. onlyData.add(list1);
  890. }
  891. if (uid.equals("2")) {
  892. //设置年份用的
  893. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  894. //给前端用的日期格式
  895. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
  896. //获取查询的年份
  897. int toYear = Integer.parseInt(sdf.format(startTime));
  898. int toYear2 = Integer.parseInt(sdf.format(endTime));
  899. Calendar calendar = Calendar.getInstance();
  900. calendar.clear();
  901. calendar.set(Calendar.YEAR, toYear);
  902. //当前年的开始时间
  903. long startHour = calendar.getTimeInMillis();
  904. calendar.clear();
  905. calendar.set(Calendar.YEAR, toYear2);
  906. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  907. //当前年的结束时间
  908. endTime = endTime + 100L;
  909. // 根据开始时间、结束时间分割的月份
  910. List<Long> timeList = DateTimeUtil.getIntervalTimeByMonth(new Date(startHour), new Date(endTime));
  911. // 开始年和结束年相同 getIntervalTimeByMonth 最后一个月会重复两次
  912. if (toYear == toYear2) {
  913. timeList.remove(timeList.size() - 1);
  914. }
  915. windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startHour), new Date(endTime), eqId);
  916. for (String h : heightSort) {
  917. String wpdMonthFieldName = h + "wpdMonth";
  918. //存放数据
  919. List<EquipmentAttribute> wpdDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(wpdMonthFieldName)).collect(Collectors.toList());
  920. if (!wpdDayFieldNameList.isEmpty()) {
  921. //获取对应的ebId
  922. String wpdDayEbId = wpdDayFieldNameList.get(0).getId();
  923. //平均风速集合
  924. List<WindTowerCalculationData> wpdMonthList = new ArrayList<>();
  925. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wpdDayEbId)).collect(Collectors.toList());
  926. BigDecimal wpdAve = BigDecimal.ZERO;
  927. ArrayList<Object> list = new ArrayList<>();
  928. for (long time : timeList) {
  929. wpdMonthList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(time)) == 0).collect(Collectors.toList());
  930. HashMap<Object, Object> map = new HashMap<>();
  931. String format = sdf1.format(time);
  932. BigDecimal value = BigDecimal.ZERO;
  933. if (!wpdMonthList.isEmpty()) {
  934. value = wpdMonthList.get(0).getValue();
  935. }
  936. map.put("wpd", value);
  937. map.put("time", format);
  938. list.add(map);
  939. }
  940. // 曲线
  941. HashMap<Object, Object> finalMap = new HashMap<>();
  942. finalMap.put("height", h);
  943. finalMap.put("arr", list);
  944. arrList.add(finalMap);
  945. //平均值
  946. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  947. if (!aveWsList.isEmpty()) {
  948. wpdAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  949. }
  950. HashMap<Object, Object> finalAveMap = new HashMap<>();
  951. finalAveMap.put("height", h);
  952. finalAveMap.put("wpdAve", wpdAve);
  953. list1.add(finalAveMap);
  954. }
  955. }
  956. onlyData.add(arrList);
  957. onlyData.add(list1);
  958. }
  959. return onlyData;
  960. }
  961. /**
  962. * 时间段(年逐月)风切变曲线图(统计查询)
  963. *
  964. * @param height 测高
  965. * @param eqId 设备编号
  966. * @return List<Object>
  967. */
  968. public List<Object> getShear(Long startTime, Long endTime, String height, String eqId) {
  969. //最后返回的
  970. ArrayList<Object> onlyData = new ArrayList<>();
  971. //装所有风功率密度数据
  972. ArrayList<Object> arrList = new ArrayList<>();
  973. //装平均值
  974. ArrayList<Object> list1 = new ArrayList<>();
  975. List<String> heightSort = new ArrayList<>();
  976. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  977. //给前端用的日期格式
  978. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
  979. //获取统计属性表
  980. List<EquipmentAttribute> shearDayFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, "windShearMonth").list();
  981. //获取统计数据表
  982. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId).stream().sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  983. ;
  984. // 根据开始时间、结束时间分割的月份
  985. List<Long> timeList = DateTimeUtil.getIntervalTimeByMonth(new Date(startTime), new Date(endTime));
  986. //存放数据
  987. if (!shearDayFieldNameList.isEmpty()) {
  988. String shearDayEbId = shearDayFieldNameList.get(0).getId();
  989. //风切变集合
  990. List<WindTowerCalculationData> shearMonthList = new ArrayList<>();
  991. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(shearDayEbId)).collect(Collectors.toList());
  992. BigDecimal shearAve = BigDecimal.ZERO;
  993. ArrayList<Object> list = new ArrayList<>();
  994. for (long time : timeList) {
  995. shearMonthList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(time)) == 0).collect(Collectors.toList());
  996. HashMap<Object, Object> map = new HashMap<>();
  997. String format = sdf1.format(time);
  998. BigDecimal value = BigDecimal.ZERO;
  999. if (!shearMonthList.isEmpty()) {
  1000. value = shearMonthList.get(0).getValue();
  1001. }
  1002. map.put("shear", value);
  1003. map.put("time", format);
  1004. list.add(map);
  1005. }
  1006. // 曲线
  1007. HashMap<Object, Object> finalMap = new HashMap<>();
  1008. finalMap.put("height", "综合风切变");
  1009. finalMap.put("arr", list);
  1010. arrList.add(finalMap);
  1011. //平均值
  1012. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  1013. if (!aveWsList.isEmpty()) {
  1014. shearAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  1015. }
  1016. HashMap<Object, Object> finalAveMap = new HashMap<>();
  1017. finalAveMap.put("height", "综合风切变");
  1018. finalAveMap.put("shearAve", shearAve);
  1019. list1.add(finalAveMap);
  1020. }
  1021. onlyData.add(arrList);
  1022. onlyData.add(list1);
  1023. return onlyData;
  1024. }
  1025. /**
  1026. * 计算日平均空气密度
  1027. *
  1028. * @param startTime 开始时间
  1029. * @param endTime 结束时间
  1030. * @param equipmentId 设备ID
  1031. * @return
  1032. */
  1033. public ArrayList<WindTowerCalculationData> airDensityDay(Date startTime, Date endTime, String equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerCalculationData> windTowerCalculationDataList) {
  1034. long startHour = startTime.getTime();
  1035. long endHour = endTime.getTime();
  1036. Long dayTime = 86400000L;
  1037. //空气密度属性
  1038. EquipmentAttribute equipmentAttribute = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals("airDensity")).collect(Collectors.toList()).get(0);
  1039. //删除时间段所有数据
  1040. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, equipmentAttribute.getId());
  1041. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1042. try {
  1043. for (long start1 = startHour; start1 < endHour; start1 = start1 + dayTime) {
  1044. //每天的结束时间
  1045. long start2 = start1 + dayTime - 1L;
  1046. BigDecimal airDensityDay = new BigDecimal(0);
  1047. long start = start1;
  1048. List<ProphaseWeatherData> collect = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= start && p.getTs().getTime() <= start2 && p.getAirDensity() != null && p.getAirDensity() > 0).collect(Collectors.toList());
  1049. //存平均值
  1050. if (!collect.isEmpty()) {
  1051. for (ProphaseWeatherData map : collect) {
  1052. airDensityDay = airDensityDay.add(CalculationUtil.getBigDecimal(map.getAirDensity()));
  1053. }
  1054. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1055. windTowerCalculationData.setEbId(equipmentAttribute.getId());
  1056. windTowerCalculationData.setTime(new Date(start1));
  1057. windTowerCalculationData.setValue(airDensityDay.divide(new BigDecimal(collect.size()), 2, RoundingMode.HALF_UP));
  1058. windTowerCalculationData.setEquipmentId(equipmentId);
  1059. windTowerCalculationDataList.add(windTowerCalculationData);
  1060. list.add(windTowerCalculationData);
  1061. }
  1062. }
  1063. } catch (Exception e) {
  1064. log.error("计算日平均空气密度失败");
  1065. e.printStackTrace();
  1066. }
  1067. // saveBatchByEquipmentId(list, equipmentId);
  1068. log.info("计算日平均空气密度完成");
  1069. return list;
  1070. }
  1071. /**
  1072. * 计算月最大风速
  1073. *
  1074. * @param startTime 开始时间
  1075. * @param endTime 结束时间
  1076. * @param equipmentId 设备id
  1077. * @return
  1078. */
  1079. public ArrayList<WindTowerCalculationData> wsMaxMonth(Date startTime, Date endTime, String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  1080. //获取时间段所有统计数据
  1081. // List<Map<String, Object>> collects = mapList.stream().filter(w -> Long.parseLong(w.get("time").toString()) >= startTime.getTime()
  1082. // && Long.parseLong(w.get("time").toString()) <= endTime.getTime() && w.get("equipment_id").equals(equipmentId)).collect(Collectors.toList());
  1083. List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime() && p.getTs().getTime() <= endTime.getTime() && p.getWsMax() != null && p.getWsMax() != -99).collect(Collectors.toList());
  1084. //获取所有层高
  1085. String[] height = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights().split(",");
  1086. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1087. try {
  1088. for (String h : height) {
  1089. //获取对应层高的字段
  1090. String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "maxwsMonth")).collect(Collectors.toList()).get(0).getId();
  1091. //删除时间段所有数据
  1092. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdMonth);
  1093. if (!collect.isEmpty()) {
  1094. BigDecimal max = CalculationUtil.getBigDecimal(collect.stream().filter(c -> c.getLayerHeight().equals(h)).mapToDouble(ProphaseAnemometryData::getWsMax).sum());
  1095. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1096. windTowerCalculationData.setEbId(ebIdMonth);
  1097. windTowerCalculationData.setTime(startTime);
  1098. windTowerCalculationData.setEquipmentId(equipmentId);
  1099. windTowerCalculationData.setValue(max.divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP));
  1100. list.add(windTowerCalculationData);
  1101. } else {
  1102. log.info("设备编号{},{}月,{}米层高月最大风速计算失败,缺少数据^ ^", equipmentId, startTime.getMonth() + 1, h);
  1103. }
  1104. }
  1105. } catch (Exception e) {
  1106. log.error("设备编号{}月最大风速计算失败^ ^", equipmentId);
  1107. }
  1108. // saveBatchByEquipmentId(list, equipmentId);
  1109. log.info("设备编号{}月最大风速计算成功^ ^", equipmentId);
  1110. return list;
  1111. }
  1112. /**
  1113. * 计算月平均空气密度
  1114. *
  1115. * @param startTime 开始时间
  1116. * @param endTime 结束时间
  1117. * @param equipmentId 设备ID
  1118. * @return
  1119. */
  1120. public ArrayList<WindTowerCalculationData> airDensityMonth(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList) {
  1121. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1122. //时间-1防止0点数据查不到
  1123. Date startHour = new Date(startTime.getTime() - 1);
  1124. //获取时间段所有统计数据
  1125. List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour) && w.getTime().before(endTime)).collect(Collectors.toList());
  1126. EquipmentAttribute equipmentAttribute = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals("airDensity")).collect(Collectors.toList()).get(0);
  1127. EquipmentAttribute equipmentAttributeMonth = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals("airDensityMonth")).collect(Collectors.toList()).get(0);
  1128. //删除
  1129. removeByStartTimeBetweenAndEquipmentIdAndEbId(startHour, endTime, equipmentId, equipmentAttributeMonth.getId());
  1130. BigDecimal airDensityMonth = new BigDecimal(0);
  1131. try {
  1132. //找出空气密度和月空气密度属性
  1133. //所有数据日空气密度
  1134. List<WindTowerCalculationData> windCalDataList = windTowerCalculationDataList1.stream().filter(w -> w.getTime().after(startHour) &&
  1135. w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId) && w.getEbId().equals(equipmentAttribute.getId())).collect(Collectors.toList());
  1136. for (WindTowerCalculationData w : windCalDataList) {
  1137. airDensityMonth = airDensityMonth.add(w.getValue());
  1138. }
  1139. //平均值
  1140. if (!windCalDataList.isEmpty()) {
  1141. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1142. windTowerCalculationData.setEbId(equipmentAttributeMonth.getId());
  1143. windTowerCalculationData.setTime(startTime);
  1144. windTowerCalculationData.setValue(airDensityMonth.divide(new BigDecimal(windCalDataList.size()), 2, RoundingMode.HALF_UP));
  1145. windTowerCalculationData.setEquipmentId(equipmentId);
  1146. list.add(windTowerCalculationData);
  1147. // saveByEquipmentId(windTowerCalculationData, equipmentId);
  1148. log.info("计算月平均空气密度完成");
  1149. } else {
  1150. log.info("月平均空气密度缺少数据,无法计算");
  1151. }
  1152. } catch (Exception e) {
  1153. log.error("计算月平均空气密度失败");
  1154. e.printStackTrace();
  1155. }
  1156. return list;
  1157. }
  1158. /**
  1159. * 计算日平均风速
  1160. *
  1161. * @param startTime 开始时间
  1162. * @param endTime 结束时间
  1163. * @param equipmentId 设备id
  1164. * @return
  1165. */
  1166. public ArrayList<WindTowerCalculationData> wsDay(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  1167. long startHour = startTime.getTime();
  1168. long endHour = endTime.getTime();
  1169. Long dayTime = 86400000L;
  1170. //获取测风塔所有层高
  1171. String heights = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights();
  1172. String[] strings = heights.split(",");
  1173. List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startTime) && w.getTime().before(endTime)).collect(Collectors.toList());
  1174. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1175. try {
  1176. //遍历测风塔所有层高
  1177. for (String h : strings) {
  1178. //获取小时风速表
  1179. List<EquipmentAttribute> awsList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(h + "aws")).collect(Collectors.toList());
  1180. //获取日风速表
  1181. List<EquipmentAttribute> awsDayList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(h + "awsDay")).collect(Collectors.toList());
  1182. //删除
  1183. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, awsDayList.get(0).getId());
  1184. for (long start1 = startHour; start1 < endHour; start1 = start1 + dayTime) {
  1185. long start2 = start1 + dayTime - 1L;
  1186. //获取小时风速数据
  1187. long start = start1;
  1188. List<WindTowerCalculationData> wsCalDataList = windTowerCalculationDataList1.stream().filter(
  1189. w -> w.getTime().after(new Date(start)) &&
  1190. w.getTime().before(new Date(start2)) &&
  1191. w.getEquipmentId().equals(equipmentId) &&
  1192. w.getEbId().equals(awsList.get(0).getId()))
  1193. .collect(Collectors.toList()
  1194. );
  1195. //小时风功率总值
  1196. BigDecimal awsSum = BigDecimal.ZERO;
  1197. for (WindTowerCalculationData ws : wsCalDataList) {
  1198. awsSum = awsSum.add(ws.getValue()).setScale(4, RoundingMode.HALF_UP);
  1199. }
  1200. if (!wsCalDataList.isEmpty()) {
  1201. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1202. windTowerCalculationData.setEquipmentId(equipmentId);
  1203. windTowerCalculationData.setValue(awsSum.divide(new BigDecimal(wsCalDataList.size()), 2, RoundingMode.HALF_UP));
  1204. windTowerCalculationData.setEbId(awsDayList.get(0).getId());
  1205. windTowerCalculationData.setTime(new Date(start1));
  1206. windTowerCalculationDataList.add(windTowerCalculationData);
  1207. list.add(windTowerCalculationData);
  1208. } else {
  1209. log.info("设备编号{},{},{}米层高日平均风速计算失败,缺少数据^ ^", equipmentId, DateTimeUtil.dateToStrLong(new Date(start1)), h);
  1210. }
  1211. }
  1212. }
  1213. } catch (Exception e) {
  1214. log.error("设备编号{}日平均风速计算失败^ ^", equipmentId);
  1215. e.printStackTrace();
  1216. }
  1217. // saveBatchByEquipmentId(list, equipmentId);
  1218. log.info("设备编号{}米层高日平均风速计算成功^ ^", equipmentId);
  1219. return list;
  1220. }
  1221. /**
  1222. * 计算月平均风速
  1223. *
  1224. * @param startTime 开始时间
  1225. * @param endTime 结束时间
  1226. * @param equipmentId 设备编号
  1227. * @return
  1228. */
  1229. public ArrayList<WindTowerCalculationData> wsMonth(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  1230. //时间-1防止0点数据查不到
  1231. Date startHour = new Date(startTime.getTime() - 1);
  1232. //获取时间段所有统计数据
  1233. List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour) && w.getTime().before(endTime)).collect(Collectors.toList());
  1234. //获取所有层高
  1235. String[] height = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights().split(",");
  1236. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1237. //遍历层高
  1238. try {
  1239. for (String h : height) {
  1240. //获取对应层高的月平均风速字段
  1241. String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "awsMonth")).collect(Collectors.toList()).get(0).getId();
  1242. String ebIdDay = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "awsDay")).collect(Collectors.toList()).get(0).getId();
  1243. //删除时间段所有数据
  1244. removeByStartTimeBetweenAndEquipmentIdAndEbId(startHour, endTime, equipmentId, ebIdMonth);
  1245. //获取所有日平均风速
  1246. List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(ebIdDay) && w.getTime().after(startHour) && w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId)).collect(Collectors.toList());
  1247. BigDecimal wsSum = new BigDecimal(0);
  1248. for (WindTowerCalculationData w : windTowerCalculationDatas) {
  1249. wsSum = wsSum.add(w.getValue());
  1250. }
  1251. if (!windTowerCalculationDatas.isEmpty()) {
  1252. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1253. windTowerCalculationData.setEbId(ebIdMonth);
  1254. windTowerCalculationData.setTime(startTime);
  1255. windTowerCalculationData.setEquipmentId(equipmentId);
  1256. windTowerCalculationData.setValue(wsSum.divide(new BigDecimal(windTowerCalculationDatas.size()), 2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP));
  1257. list.add(windTowerCalculationData);
  1258. } else {
  1259. log.info("设备编号{},{}月,{}米层高月平均风速计算失败,缺少数据^ ^", equipmentId, startTime.getMonth() + 1, h);
  1260. }
  1261. }
  1262. } catch (Exception e) {
  1263. log.error("设备编号{}月平均风速计算失败^ ^", equipmentId);
  1264. e.printStackTrace();
  1265. }
  1266. // saveBatchByEquipmentId(list, equipmentId);
  1267. log.info("{}设备月平均风速统计完成", equipmentId);
  1268. return list;
  1269. }
  1270. /**
  1271. * 计算日平均风功率密度
  1272. *
  1273. * @param startTime 开始时间
  1274. * @param endTime 结束时间
  1275. * @param equipmentId 设备id
  1276. * @return
  1277. */
  1278. public ArrayList<WindTowerCalculationData> wpdDay(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  1279. long startHour = startTime.getTime();
  1280. long endHour = endTime.getTime();
  1281. long dayTime = 86400000L;
  1282. List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startTime) && w.getTime().before(endTime)).collect(Collectors.toList());
  1283. //获取所有层高
  1284. String heights = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights();
  1285. String[] strings = heights.split(",");
  1286. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1287. try {
  1288. //遍历层高
  1289. for (String h : strings) {
  1290. //获取所有小时风功率表
  1291. List<EquipmentAttribute> wpdList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(h + "wpd")).collect(Collectors.toList());
  1292. //获取所有日风功率表
  1293. List<EquipmentAttribute> wpdDayList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(h + "wpdDay")).collect(Collectors.toList());
  1294. //删除
  1295. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, wpdDayList.get(0).getId());
  1296. for (long start1 = startHour; start1 < endHour; start1 = start1 + dayTime) {
  1297. long start2 = start1 + dayTime - 1L;
  1298. //获取所有小时风功率数据
  1299. long start = start1;
  1300. List<WindTowerCalculationData> wpdCalDataList = windTowerCalculationDataList1.stream().filter(w -> w.getTime().after(new Date(start)) &&
  1301. w.getTime().before(new Date(start2)) && w.getEquipmentId().equals(equipmentId) && w.getEbId().equals(wpdList.get(0).getId())).collect(Collectors.toList());
  1302. //小时风功率总值
  1303. BigDecimal wpdSum = BigDecimal.ZERO;
  1304. for (WindTowerCalculationData wpd : wpdCalDataList) {
  1305. wpdSum = wpdSum.add(wpd.getValue());
  1306. }
  1307. if (!wpdCalDataList.isEmpty()) {
  1308. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1309. windTowerCalculationData.setEquipmentId(equipmentId);
  1310. windTowerCalculationData.setValue(wpdSum.divide(BigDecimal.valueOf(wpdCalDataList.size()), 2, RoundingMode.HALF_UP));
  1311. windTowerCalculationData.setEbId(wpdDayList.get(0).getId());
  1312. windTowerCalculationData.setTime(new Date(start1));
  1313. windTowerCalculationDataList.add(windTowerCalculationData);
  1314. list.add(windTowerCalculationData);
  1315. } else {
  1316. log.info("设备编号{},{},{}米层高日平均风功率计算失败,缺少数据^ ^", equipmentId, DateTimeUtil.dateToStrLong(new Date(start1)), h);
  1317. }
  1318. }
  1319. }
  1320. } catch (Exception e) {
  1321. log.error("设备编号{}日平均风功率计算失败^ ^", equipmentId);
  1322. e.printStackTrace();
  1323. }
  1324. // saveBatchByEquipmentId(list, equipmentId);
  1325. log.info("设备编号{}日平均风功率计算成功^ ^", equipmentId);
  1326. return list;
  1327. }
  1328. /**
  1329. * 计算月平均风功率密度
  1330. *
  1331. * @param startTime 开始时间
  1332. * @param endTime 结束时间
  1333. * @param equipmentId 设备id
  1334. * @return
  1335. */
  1336. @Transactional
  1337. public ArrayList<WindTowerCalculationData> wpdMonth(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  1338. //时间-1防止0点数据查不到
  1339. Date startHour = new Date(startTime.getTime() - 1);
  1340. //获取时间段所有统计数据
  1341. List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour) && w.getTime().before(endTime)).collect(Collectors.toList());
  1342. //获取所有层高
  1343. String[] height = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights().split(",");
  1344. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1345. try {
  1346. for (String h : height) {
  1347. //获取对应层高的月平均风速字段
  1348. String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "wpdMonth")).collect(Collectors.toList()).get(0).getId();
  1349. String ebIdDay = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "wpdDay")).collect(Collectors.toList()).get(0).getId();
  1350. //删除时间段所有数据
  1351. removeByStartTimeBetweenAndEquipmentIdAndEbId(startHour, endTime, equipmentId, ebIdMonth);
  1352. //获取所有日平均风功率密度
  1353. List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(ebIdDay) && w.getTime().after(startHour) && w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId)).collect(Collectors.toList());
  1354. BigDecimal sum = new BigDecimal(0);
  1355. for (WindTowerCalculationData w : windTowerCalculationDatas) {
  1356. sum = sum.add(w.getValue());
  1357. }
  1358. if (!windTowerCalculationDatas.isEmpty()) {
  1359. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1360. windTowerCalculationData.setEbId(ebIdMonth);
  1361. windTowerCalculationData.setTime(startTime);
  1362. windTowerCalculationData.setEquipmentId(equipmentId);
  1363. windTowerCalculationData.setValue(sum.divide(new BigDecimal(windTowerCalculationDatas.size()), 2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP));
  1364. list.add(windTowerCalculationData);
  1365. } else {
  1366. log.info("设备编号{},{}月,{}米层高月平均风功率密度计算失败,缺少数据^ ^", equipmentId, startTime.getMonth() + 1, h);
  1367. }
  1368. }
  1369. } catch (Exception e) {
  1370. log.error("设备编号{}月平均风功率计算失败^ ^", equipmentId);
  1371. e.printStackTrace();
  1372. }
  1373. // saveBatchByEquipmentId(list, equipmentId);
  1374. log.info("设备编号{}高月平均风功率计算成功^ ^", equipmentId);
  1375. return list;
  1376. }
  1377. /**
  1378. * 计算日平均风速标差
  1379. *
  1380. * @param startTime 开始时间
  1381. * @param endTime 结束时间
  1382. * @param equipmentId 测风塔编号
  1383. * @param equipmentAttributeList 属性表
  1384. * @param windTowerInfoList 测风塔数据
  1385. * @return
  1386. */
  1387. public ArrayList<WindTowerCalculationData> calculateStaDay(Date startTime, Date endTime, String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList, List<WindTowerCalculationData> windTowerCalculationDataList) {
  1388. ArrayList<WindTowerCalculationData> dataList = new ArrayList<>();
  1389. long startHour = startTime.getTime();
  1390. long endHour = endTime.getTime();
  1391. long Hour = 86400000;
  1392. String[] heights = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights().split(",");
  1393. prophaseAnemometryDataList = prophaseAnemometryDataList.stream().filter(p -> p.getWsSta() != null && p.getWsSta() != -99).collect(Collectors.toList());
  1394. try {
  1395. for (String h : heights) {
  1396. //获取对应层高的属性
  1397. List<EquipmentAttribute> equipmentAttributes = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "staDay")).collect(Collectors.toList());
  1398. //删除数据
  1399. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, equipmentAttributes.get(0).getId());
  1400. //每天循环
  1401. for (long time = startHour; time < endHour; time = time + Hour) {
  1402. long startDate = time;
  1403. //过滤一天的数据
  1404. List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startDate && p.getTs().getTime() < startDate + Hour && p.getLayerHeight().equals(h)).collect(Collectors.toList());
  1405. BigDecimal staSum = CalculationUtil.getBigDecimal(collect.stream().filter(c -> c.getWsSta() != null && c.getWsSta() != 0).mapToDouble(ProphaseAnemometryData::getWsSta).sum());
  1406. if (collect.size() > 0) {
  1407. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1408. windTowerCalculationData.setEquipmentId(equipmentId);
  1409. windTowerCalculationData.setTime(new Date(startDate));
  1410. windTowerCalculationData.setValue(staSum.divide(CalculationUtil.getBigDecimal(collect.size()), 2, RoundingMode.HALF_UP));
  1411. windTowerCalculationData.setEbId(equipmentAttributes.get(0).getId());
  1412. windTowerCalculationDataList.add(windTowerCalculationData);
  1413. dataList.add(windTowerCalculationData);
  1414. }
  1415. }
  1416. }
  1417. } catch (Exception e) {
  1418. log.error("设备编号{}日平均风速标差计算失败^ ^", equipmentId);
  1419. e.printStackTrace();
  1420. }
  1421. // saveBatchByEquipmentId(dataList);
  1422. log.info("设备编号{},风速标差数据计算完成", equipmentId);
  1423. return dataList;
  1424. }
  1425. /**
  1426. * 计算日平均湍流
  1427. *
  1428. * @param startTime 开始时间
  1429. * @param endTime 结束时间
  1430. * @param equipmentId 设备id
  1431. * @return
  1432. */
  1433. public ArrayList<WindTowerCalculationData> turbulenceDay(Date startTime, Date endTime, String equipmentId, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList, List<WindTowerCalculationData> windTowerCalculationDataList) {
  1434. long startHour = startTime.getTime();
  1435. long endHour = endTime.getTime();
  1436. long dayTime = 86400000L;
  1437. String heights = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights();
  1438. String[] heightAll = heights.split(",");
  1439. //获取对应测风塔数据
  1440. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1441. try {
  1442. for (String h : heightAll) {
  1443. List<EquipmentAttribute> turList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(h + turbulenceDay)).collect(Collectors.toList());
  1444. List<EquipmentAttribute> staList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(h + staDay)).collect(Collectors.toList());
  1445. List<EquipmentAttribute> wsList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(h + "awsDay")).collect(Collectors.toList());
  1446. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, turList.get(0).getId());
  1447. for (long start1 = startHour; start1 < endHour; start1 = start1 + dayTime) {
  1448. long finalStart = start1;
  1449. List<WindTowerCalculationData> staDay = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(staList.get(0).getId()) && w.getTime().getTime() == finalStart).collect(Collectors.toList());
  1450. List<WindTowerCalculationData> wsDay = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wsList.get(0).getId()) && w.getTime().getTime() == finalStart).collect(Collectors.toList());
  1451. if (!staDay.isEmpty() && !wsDay.isEmpty()) {
  1452. //数据入库
  1453. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1454. windTowerCalculationData.setTime(new Date(start1));
  1455. windTowerCalculationData.setEbId(turList.get(0).getId());
  1456. windTowerCalculationData.setEquipmentId(equipmentId);
  1457. windTowerCalculationData.setValue(CalculationUtil.caTurbulenceIntensity(staDay.get(0).getValue(), wsDay.get(0).getValue()));
  1458. windTowerCalculationDataList.add(windTowerCalculationData);
  1459. list.add(windTowerCalculationData);
  1460. } else {
  1461. log.info("设备编号{},{},{}米层高日平均湍流计算失败,缺少数据^ ^", equipmentId, DateTimeUtil.dateToStrLong(new Date(start1)), h);
  1462. }
  1463. }
  1464. }
  1465. } catch (NumberFormatException e) {
  1466. log.error("设备编号{}日平均湍流计算失败^ ^", equipmentId);
  1467. e.printStackTrace();
  1468. }
  1469. // saveBatchByEquipmentId(list, equipmentId);
  1470. log.info("设备编号{}日平均湍流计算成功^ ^", equipmentId);
  1471. return list;
  1472. }
  1473. /**
  1474. * 月平均湍流
  1475. *
  1476. * @param startTime 开始时间
  1477. * @param endTime 结束时间
  1478. * @param equipmentId 设备编号
  1479. * @return
  1480. */
  1481. public ArrayList<WindTowerCalculationData> turbulenceMonth(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  1482. //时间-1防止0点数据查不到
  1483. Date startHour = new Date(startTime.getTime() - 1);
  1484. //获取时间段所有统计数据
  1485. List<WindTowerCalculationData> windTowerCalculationDataList1 = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(equipmentId) && w.getTime().after(startHour) && w.getTime().before(endTime)).collect(Collectors.toList());
  1486. //获取所有层高
  1487. String[] height = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights().split(",");
  1488. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1489. try {
  1490. for (String h : height) {
  1491. //获取对应层高的月平均风速字段
  1492. String ebIdDay = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "turbulenceDay")).collect(Collectors.toList()).get(0).getId();
  1493. String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "turbulenceMonth")).collect(Collectors.toList()).get(0).getId();
  1494. //删除时间段所有数据
  1495. removeByStartTimeBetweenAndEquipmentIdAndEbId(startHour, endTime, equipmentId, ebIdMonth);
  1496. //获取所有日平均湍流风速
  1497. List<WindTowerCalculationData> windTowerCalculationDatas = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(ebIdDay) && w.getTime().after(startHour) && w.getTime().before(endTime) && w.getEquipmentId().equals(equipmentId)).collect(Collectors.toList());
  1498. BigDecimal sum = new BigDecimal(0);
  1499. for (WindTowerCalculationData w : windTowerCalculationDatas) {
  1500. sum = sum.add(w.getValue());
  1501. }
  1502. if (!windTowerCalculationDatas.isEmpty()) {
  1503. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1504. windTowerCalculationData.setEbId(ebIdMonth);
  1505. windTowerCalculationData.setTime(startTime);
  1506. windTowerCalculationData.setEquipmentId(equipmentId);
  1507. windTowerCalculationData.setValue(sum.divide(new BigDecimal(windTowerCalculationDatas.size()), 2, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP));
  1508. list.add(windTowerCalculationData);
  1509. } else {
  1510. log.info("设备编号{},{}月,{}米层高月平均湍流计算失败,缺少数据^ ^", equipmentId, startTime.getMonth() + 1, h);
  1511. }
  1512. }
  1513. } catch (Exception e) {
  1514. log.error("设备编号{}月平均湍流计算失败^ ^", equipmentId);
  1515. }
  1516. // saveBatchByEquipmentId(list, equipmentId);
  1517. log.info("设备编号{}月平均湍流计算成功^ ^", equipmentId);
  1518. return list;
  1519. }
  1520. /**
  1521. * 计算日风切变入库
  1522. *
  1523. * @param startTime 开始时间
  1524. * @param endTime 结束时间
  1525. * @param equipmentId 设备id
  1526. * @return
  1527. */
  1528. public ArrayList<WindTowerCalculationData> shearDay(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList, List<ProphaseAnemometryData> prophaseAnemometryDataList) {
  1529. long startHour = startTime.getTime();
  1530. long endHour = endTime.getTime();
  1531. long dayTime = 86400000L;
  1532. String[] heights = windTowerInfoList.get(0).getHeights().split(",");
  1533. List<ProphaseAnemometryData> prophaseAnemometryData = prophaseAnemometryDataList.stream().filter(p -> p.getWsAve() != null && p.getWsAve() != -99).collect(Collectors.toList());
  1534. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1535. try {
  1536. //获取日综合风切变
  1537. List<EquipmentAttribute> shearDayList = equipmentAttributeList.stream().filter(equipmentAttribute -> equipmentAttribute.getFieldName().equals(windShearDayFiledName)).collect(Collectors.toList());
  1538. //删除统计时间段所有数据
  1539. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, shearDayList.get(0).getId());
  1540. for (long start1 = startHour; start1 < endHour; start1 = start1 + dayTime) {
  1541. long start2 = start1 + dayTime - 1L;
  1542. //获取所有小时风切变数据
  1543. long start = start1;
  1544. List<ProphaseAnemometryData> collect = prophaseAnemometryData.stream().filter(p -> p.getTs().getTime() >= start && p.getTs().getTime() < start2).collect(Collectors.toList());
  1545. BigDecimal windShear = CalculationUtil.getWindShear(collect, heights);
  1546. if (collect.size() > 0) {
  1547. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1548. windTowerCalculationData.setEquipmentId(equipmentId);
  1549. windTowerCalculationData.setValue(windShear);
  1550. windTowerCalculationData.setEbId(shearDayList.get(0).getId());
  1551. windTowerCalculationData.setTime(new Date(start1));
  1552. windTowerCalculationDataList.add(windTowerCalculationData);
  1553. list.add(windTowerCalculationData);
  1554. } else {
  1555. log.info("设备编号{},{},{}米层高日平均风切变计算失败,缺少数据^ ^", equipmentId, DateTimeUtil.dateToStrLong(new Date(start1)));
  1556. }
  1557. }
  1558. } catch (Exception e) {
  1559. log.error("设备编号{}日平均风切变计算失败^ ^", equipmentId);
  1560. e.printStackTrace();
  1561. }
  1562. // saveBatchByEquipmentId(list, equipmentId);
  1563. log.info("设备编号{}日平均风切变计算成功^ ^", equipmentId);
  1564. return list;
  1565. }
  1566. /**
  1567. * 计算月风切变入库
  1568. *
  1569. * @param startTime 开始时间
  1570. * @param endTime 结束时间
  1571. * @param equipmentId 设备id
  1572. * @return
  1573. */
  1574. public ArrayList<WindTowerCalculationData> shearMonth(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList, List<ProphaseAnemometryData> prophaseAnemometryDataList) {
  1575. //时间-1防止0点数据查不到
  1576. Date startHour = new Date(startTime.getTime() - 1);
  1577. //获取时间段所有统计数据
  1578. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1579. try {
  1580. //获取月平均综合风切变字段
  1581. String ebIdMonth = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("windShearMonth")).collect(Collectors.toList()).get(0).getId();
  1582. //删除时间段所有数据
  1583. removeByStartTimeBetweenAndEquipmentIdAndEbId(startHour, endTime, equipmentId, ebIdMonth);
  1584. String heights = windTowerInfoList.get(0).getHeights();
  1585. List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime() && p.getTs().getTime() < endTime.getTime() && p.getWsAve() != null && p.getWsAve() > 0).collect(Collectors.toList());
  1586. BigDecimal windShear = CalculationUtil.getWindShear(collect, heights.split(","));
  1587. if (collect.size() > 0) {
  1588. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1589. windTowerCalculationData.setEbId(ebIdMonth);
  1590. windTowerCalculationData.setTime(startTime);
  1591. windTowerCalculationData.setEquipmentId(equipmentId);
  1592. windTowerCalculationData.setValue(windShear);
  1593. list.add(windTowerCalculationData);
  1594. } else {
  1595. log.info("设备编号{},{}月平均风切变指数计算失败,缺少数据^ ^", equipmentId, startTime.getMonth() + 1);
  1596. }
  1597. } catch (Exception e) {
  1598. log.error("设备编号{}月平均风月切变计算失败^ ^", equipmentId);
  1599. e.printStackTrace();
  1600. }
  1601. // saveBatchByEquipmentId(list, equipmentId);
  1602. log.info("设备编号{}月平均风切变计算成功^ ^", equipmentId);
  1603. return list;
  1604. }
  1605. /**
  1606. * 威布尔AK计算
  1607. *
  1608. * @param startTime 开始时间
  1609. * @param endTime 结束时间
  1610. * @param equipmentId 测风塔Id
  1611. * @param windTowerCalculationDataList 统计库数据
  1612. * @param equipmentAttributeList 统计表数据
  1613. * @param windTowerInfoList 测风塔表数据
  1614. */
  1615. public void statisticsWeiBullForAKForYear(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  1616. //获取时间段测风塔数据
  1617. List<WindTowerCalculationData> windTowerCalculationDataList1 = getByBetweenTimeAndEquipmentId(startTime, endTime, equipmentId);
  1618. String[] heights = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights().split(",");
  1619. //存数据用的集合
  1620. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1621. //遍历层高
  1622. try {
  1623. for (String h : heights) {
  1624. ArrayList<Object> wsList = new ArrayList<>();
  1625. //获取AK的ebId 以及小时风速id
  1626. String ebIdA = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(h + "weibullA")).collect(Collectors.toList()).get(0).getId();
  1627. String ebIdK = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(h + "weibullK")).collect(Collectors.toList()).get(0).getId();
  1628. String id = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(h + "aws")).collect(Collectors.toList()).get(0).getId();
  1629. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdK);
  1630. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdA);
  1631. List<WindTowerCalculationData> windTowerCalculationDataWsList = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(id)).collect(Collectors.toList());
  1632. for (WindTowerCalculationData w : windTowerCalculationDataWsList) {
  1633. if (w.getValue() != null) {
  1634. wsList.add(w.getValue());
  1635. }
  1636. }
  1637. if (!wsList.isEmpty()) {
  1638. //放入风速集合
  1639. ProbabilityPlot probabilityPlot = new ProbabilityPlot(wsList);
  1640. probabilityPlot.suppressDisplay();
  1641. //计算AK
  1642. double K = probabilityPlot.weibullTwoParGamma();
  1643. double A = probabilityPlot.weibullTwoParSigma();
  1644. WindTowerCalculationData windTowerCalculationDataK = new WindTowerCalculationData();
  1645. windTowerCalculationDataK.setValue(BigDecimal.valueOf(K));
  1646. windTowerCalculationDataK.setEbId(ebIdK);
  1647. windTowerCalculationDataK.setTime(DateUtil.beginOfDay(new Date(startTime.getTime() + 86400000 * 2)));
  1648. windTowerCalculationDataK.setEquipmentId(equipmentId);
  1649. WindTowerCalculationData windTowerCalculationDataA = new WindTowerCalculationData();
  1650. windTowerCalculationDataA.setValue(BigDecimal.valueOf(A));
  1651. windTowerCalculationDataA.setEbId(ebIdA);
  1652. windTowerCalculationDataA.setTime(DateUtil.beginOfDay(new Date(startTime.getTime() + 86400000 * 2)));
  1653. windTowerCalculationDataA.setEquipmentId(equipmentId);
  1654. list.add(windTowerCalculationDataK);
  1655. list.add(windTowerCalculationDataA);
  1656. } else {
  1657. log.info("缺少风速数据,无法计算威布尔AK值");
  1658. }
  1659. }
  1660. } catch (NumberFormatException e) {
  1661. log.error("威布尔AK计算异常");
  1662. e.printStackTrace();
  1663. }
  1664. saveBatchByEquipmentId(list, equipmentId);
  1665. log.info("设备{},威布尔AK计算成功", equipmentId);
  1666. }
  1667. /**
  1668. * 日平均温度入库
  1669. *
  1670. * @param startTime 开始时间
  1671. * @param endTime 结束时间
  1672. * @param equipmentId 设备Id
  1673. * @param equipmentAttributeList 属性集合
  1674. */
  1675. public ArrayList<WindTowerCalculationData> tDay(Date startTime, Date endTime, String equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList, List<EquipmentAttribute> equipmentAttributeList) {
  1676. String ebId = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("tDay")).collect(Collectors.toList()).get(0).getId();
  1677. long day = 86400000L;
  1678. ArrayList<WindTowerCalculationData> tList = new ArrayList<>();
  1679. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebId);
  1680. try {
  1681. for (long time = startTime.getTime(); time < endTime.getTime(); time += day) {
  1682. long dayTime = time;
  1683. //过滤一天数据
  1684. List<ProphaseWeatherData> collect = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= dayTime && p.getTs().getTime() < dayTime + day && p.getTAve() != null && p.getTAve() != -99).collect(Collectors.toList());
  1685. if (!collect.isEmpty()) {
  1686. //计算时间段内所有温度
  1687. BigDecimal tSum = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getTAve).sum());
  1688. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1689. windTowerCalculationData.setEbId(ebId);
  1690. windTowerCalculationData.setTime(new Date(dayTime));
  1691. windTowerCalculationData.setValue(tSum.divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP));
  1692. windTowerCalculationData.setEquipmentId(equipmentId);
  1693. tList.add(windTowerCalculationData);
  1694. }
  1695. }
  1696. } catch (Exception e) {
  1697. log.error("设备{}日平均温度统计异常", equipmentId);
  1698. e.printStackTrace();
  1699. }
  1700. // saveBatchByEquipmentId(list, equipmentId);
  1701. log.info("{}设备日平均温度计算完成", equipmentId);
  1702. return tList;
  1703. }
  1704. /**
  1705. * 日平均气压入库
  1706. *
  1707. * @param startTime 开始时间
  1708. * @param endTime 结束时间
  1709. * @param equipmentId 设备Id
  1710. * @param equipmentAttributeList 属性集合
  1711. */
  1712. public ArrayList<WindTowerCalculationData> paDay(Date startTime, Date endTime, String equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList, List<EquipmentAttribute> equipmentAttributeList) {
  1713. String ebId = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals("paDay")).collect(Collectors.toList()).get(0).getId();
  1714. long day = 86400000L;
  1715. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  1716. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebId);
  1717. try {
  1718. for (long time = startTime.getTime(); time < endTime.getTime(); time += day) {
  1719. long dayTime = time;
  1720. //过滤一天数据
  1721. List<ProphaseWeatherData> collect = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= dayTime && p.getTs().getTime() < dayTime + day && p.getPaAve() != null && p.getPaAve() > 0).collect(Collectors.toList());
  1722. if (!collect.isEmpty()) {
  1723. BigDecimal paSum = CalculationUtil.getBigDecimal(collect.stream().mapToDouble(ProphaseWeatherData::getPaAve).sum());
  1724. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1725. windTowerCalculationData.setEbId(ebId);
  1726. windTowerCalculationData.setTime(new Date(dayTime));
  1727. windTowerCalculationData.setValue(paSum.divide(BigDecimal.valueOf(collect.size()), 2, RoundingMode.HALF_UP));
  1728. windTowerCalculationData.setEquipmentId(equipmentId);
  1729. list.add(windTowerCalculationData);
  1730. }
  1731. }
  1732. } catch (Exception e) {
  1733. log.error("设备{}日平均气压统计异常", equipmentId);
  1734. e.printStackTrace();
  1735. }
  1736. // saveBatchByEquipmentId(list, equipmentId);
  1737. log.info("{}设备日平均气压计算完成", equipmentId);
  1738. return list;
  1739. }
  1740. /**
  1741. * 计算上一个小时 每10分钟的风切变指数
  1742. */
  1743. public ArrayList<WindTowerCalculationData> calculateWindPowerShear(Date startTime, Date endTime, String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<WindTowerCalculationData> windTowerCalculationDataList) {
  1744. log.info("开始计算小时风切变指数");
  1745. long startHour = startTime.getTime();
  1746. long endHour = endTime.getTime();
  1747. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, equipmentId).list();
  1748. String[] heights = windTowerInfoList.get(0).getHeights().split(",");
  1749. ArrayList<WindTowerCalculationData> listAll = new ArrayList<>();
  1750. //时间段内所有风数据
  1751. List<ProphaseAnemometryData> prophaseAnemometryData = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime() && p.getTs().getTime() <= endTime.getTime() && p.getWsAve() != null && p.getWsAve() > 0).collect(Collectors.toList());
  1752. EquipmentAttribute equipmentAttribute = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, windShearFiledName).list().get(0);
  1753. //删除综合风切变
  1754. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, equipmentAttribute.getId());
  1755. try {
  1756. for (long start1 = startHour; start1 <= endHour; start1 = start1 + 3600000) {
  1757. //开始时间--->start1 结束时间---->start2
  1758. long start2 = start1 + 3600000L;
  1759. long finalStart = start1;
  1760. List<ProphaseAnemometryData> collect = prophaseAnemometryData.stream().filter(p -> p.getTs().getTime() >= finalStart && p.getTs().getTime() < start2).collect(Collectors.toList());
  1761. //计算综合风切变
  1762. BigDecimal windShear = CalculationUtil.getWindShear(collect, heights);
  1763. if (collect.size() > 0) {
  1764. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  1765. windTowerCalculationData.setEquipmentId(equipmentId);
  1766. windTowerCalculationData.setTime(new Date(start1));
  1767. windTowerCalculationData.setValue(windShear);
  1768. windTowerCalculationData.setEbId(equipmentAttribute.getId());
  1769. windTowerCalculationDataList.add(windTowerCalculationData);
  1770. listAll.add(windTowerCalculationData);
  1771. }
  1772. }
  1773. } catch (Exception e) {
  1774. e.printStackTrace();
  1775. log.error("设备{}小时风切变统计异常", equipmentId);
  1776. }
  1777. //保存风切变指数
  1778. // saveBatchByEquipmentId(listAll, equipmentId);
  1779. log.info("{}设备风切变指数计算完成", equipmentId);
  1780. return listAll;
  1781. }
  1782. /**
  1783. * 根据 时间,层高,设备id 查询风切变数据
  1784. *
  1785. * @param startTime 开始时间
  1786. * @param endTime 结束时间
  1787. * @param height 层高
  1788. * @param eqId 设备id
  1789. * @return map: 一天一条
  1790. */
  1791. @Override
  1792. public List<Map<String, Object>> getWindShearByEqidAndAverageAndTime(Long startTime, Long endTime, String height, String eqId) {
  1793. List<Map<String, Object>> list = new ArrayList<>();
  1794. List<Map<String, Object>> tableList = new ArrayList<>();
  1795. Map<String, Object> map = new TreeMap<>();
  1796. String shearFieldName = "windShearDay";
  1797. List<EquipmentAttribute> shearFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, shearFieldName).list();
  1798. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  1799. if (!shearFieldNameList.isEmpty()) {
  1800. String ebId = shearFieldNameList.get(0).getId(); //属性id
  1801. //查询风切变 月平均数据 根据时间,层高,设备id 并根据时间升序排列
  1802. List<WindTowerCalculationData> windTowerCalculationDataLists = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  1803. List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataLists.stream().filter(w -> ebId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  1804. BigDecimal sum = BigDecimal.ZERO;
  1805. BigDecimal avgShear = BigDecimal.ZERO;
  1806. if (!windTowerCalculationDataList.isEmpty()) {
  1807. // //月平均风切变数据放入map返回,key为整- 小时:00
  1808. // long hour = 3600000L;
  1809. // Date systemDate = new Date();
  1810. // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
  1811. // //获取昨日开始和结束时间
  1812. // long startTime = DateMomentUtil.getDayStartTime(DateUtils.addDays(systemDate, -1).getTime());
  1813. // long endTime = startTime + 86399000;
  1814. // // 一个月或多个月数据 按照24小时分割
  1815. // for (long hourStr = startTime; hourStr <= endTime; hourStr += hour) {
  1816. // Map<String, Object> tableMap = new TreeMap<>();
  1817. // String finalTime = simpleDateFormat.format(hourStr);
  1818. // List<BigDecimal> collect = windTowerCalculationDataList.stream().filter(w -> simpleDateFormat.format(w.getTime()).equals(finalTime) &&
  1819. // w.getValue().compareTo(new BigDecimal(-99)) != 0).map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  1820. // BigDecimal avg = BigDecimal.ZERO;
  1821. // if (!collect.isEmpty()) {
  1822. // avg = collect.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(collect.size()), 4, RoundingMode.HALF_UP);
  1823. // }
  1824. // tableMap.put("time", finalTime + ":00");
  1825. // tableMap.put("windShear", avg);
  1826. // tableList.add(tableMap);
  1827. // }
  1828. for (WindTowerCalculationData windTowerCalculationData : windTowerCalculationDataList) {
  1829. Map<String, Object> tableMap = new TreeMap<>();
  1830. BigDecimal value = windTowerCalculationData.getValue().compareTo(new BigDecimal(-99)) != 0 ? windTowerCalculationData.getValue() : BigDecimal.ZERO;
  1831. tableMap.put("time", sdf.format(windTowerCalculationData.getTime()));
  1832. tableMap.put("windShear", value.setScale(2, RoundingMode.HALF_UP));
  1833. tableList.add(tableMap);
  1834. sum = sum.add(value);
  1835. }
  1836. if (sum.compareTo(new BigDecimal(0)) != 0) {
  1837. avgShear = sum.divide(new BigDecimal(windTowerCalculationDataList.size()), 2, RoundingMode.HALF_UP);
  1838. }
  1839. }
  1840. map.put("tableList", tableList);
  1841. map.put("avgShear", avgShear);
  1842. list.add(map);
  1843. // //计算月平均值
  1844. // double sum = 0;
  1845. // long count = 0;
  1846. // for (WindTowerCalculationData windTowerCalculationData : windTowerCalculationDataList) {
  1847. // double value = windTowerCalculationData.getValue().doubleValue();
  1848. // sum += value;
  1849. // count++;
  1850. // }
  1851. // BigDecimal avgShear = BigDecimal.valueOf(count > 0 ? sum / count : 0L).setScale(4, RoundingMode.HALF_UP);
  1852. // map.put("tableList", tableList);
  1853. // map.put("avgShear", avgShear);
  1854. // list.add(map);
  1855. }
  1856. return list;
  1857. }
  1858. /**
  1859. * 查询当前月的24个小时对应的风切变指数
  1860. * 每月1号的0-1点之间查询上个月的
  1861. *
  1862. * @return Map<String, WindTowerCalculationData>
  1863. */
  1864. private Map<String, WindTowerCalculationData> queryHistoryWindTowerCalculationDatas(List<WindTowerCalculationData> windTowerCalculationDataList) {
  1865. Map<String, WindTowerCalculationData> windTowerCalculationDataMap = new HashMap<>();
  1866. //查询风切变 月平均数据 根据时间,层高,设备id 并根据时间升序排列
  1867. windTowerCalculationDataList.forEach(windTowerCalculationData -> windTowerCalculationDataMap.put(windTowerCalculationData.getTime() + windTowerCalculationData.getEquipmentId() + windTowerCalculationData.getEbId(), windTowerCalculationData));
  1868. return windTowerCalculationDataMap;
  1869. }
  1870. /**
  1871. * 遍历查询到的风速数据,计算每隔10分钟的风切变指数
  1872. *
  1873. * @param map map
  1874. * @return Map<String, List < BigDecimal>>
  1875. */
  1876. private Map<String, List<BigDecimal>> traverseWindDataListCalcuShear(Map<String, BigDecimal> map, Integer heightMin) {
  1877. Map<String, List<BigDecimal>> windTowerShearMap = new HashMap<>();
  1878. map.forEach((key, value) -> {
  1879. String[] keys = key.split("-");//0:层高 1:整10分的时间点 2:设备ID 3:日
  1880. //10米层高不计算,没有更低的
  1881. if (!String.valueOf(heightMin).equals(keys[0]) && null != value) {
  1882. calculateShearByHeight10(keys, value, windTowerShearMap, map, heightMin);
  1883. }
  1884. });
  1885. return windTowerShearMap;
  1886. }
  1887. /**
  1888. * 查询数据类型表,获取所有风切变指数参数
  1889. *
  1890. * @return Map<String, String>
  1891. */
  1892. private Map<String, String> queryEquipmentAttributeMap() {
  1893. List<EquipmentAttribute> shearFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getAttributeFunction, shearFunction).list();
  1894. return shearFieldNameList.stream().collect(Collectors.toMap(EquipmentAttribute::getFieldName, EquipmentAttribute::getId));
  1895. }
  1896. /**
  1897. * 查询当前月份的风速数据,如果是1号0点-1点执行则查询上一个月的数据
  1898. *
  1899. * @return Map<String, BigDecimal>
  1900. */
  1901. private Map<String, BigDecimal> queryWindForShear(Date startTimeOfCurrentDay, Date endTimeOfCurrentDay, String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryData, String[] heights) {
  1902. Map<String, BigDecimal> windTowerStatusDataResult = new HashMap<>();
  1903. // List<Map<String, Object>> collect = mapList.stream().filter(w -> Long.parseLong(w.get("time").toString()) >= startTimeOfCurrentDay.getTime() && Long.parseLong(w.get("time").toString()) <= endTimeOfCurrentDay.getTime() && w.get("equipment_id").equals(equipmentId)).collect(Collectors.toList());
  1904. List<ProphaseAnemometryData> collect = prophaseAnemometryData.stream().filter(p -> p.getTs().getTime() >= startTimeOfCurrentDay.getTime() && p.getTs().getTime() <= endTimeOfCurrentDay.getTime()).collect(Collectors.toList());
  1905. //只取上一个小时的数据
  1906. int curentHour = startTimeOfCurrentDay.getHours();
  1907. //构造当前小时的风速map 以层高和分钟,日为key,风速为value
  1908. for (ProphaseAnemometryData map : collect) {
  1909. for (String height : heights) {
  1910. Date time = new Date(map.getTs().getTime());
  1911. if (curentHour == time.getHours() && map.getLayerHeight().equals(height)) {
  1912. //获取 毫秒数
  1913. Integer minutes = time.getMinutes();
  1914. String keyEndStr = minutes + "-" + equipmentId + "-" + DateTimeUtil.getDay(time.getTime());
  1915. windTowerStatusDataResult.put(height + "-" + keyEndStr, CalculationUtil.getBigDecimal(map.getWsAve()));
  1916. }
  1917. }
  1918. }
  1919. return windTowerStatusDataResult;
  1920. }
  1921. /**
  1922. * 查询当前月份的风速数据,如果是1号0点-1点执行则查询上一个月的数据
  1923. *
  1924. * @return Map<String, BigDecimal>
  1925. */
  1926. private Map<String, BigDecimal> queryWindForShear(Date startTimeOfCurrentDay, Date endTimeOfCurrentDay, String equipmentId, List<Map<String, Object>> mapList) {
  1927. Map<String, BigDecimal> windTowerStatusDataResult = new HashMap<>();
  1928. List<Map<String, Object>> collect = mapList.stream().filter(w -> Long.parseLong(w.get("time").toString()) >= startTimeOfCurrentDay.getTime() && Long.parseLong(w.get("time").toString()) <= endTimeOfCurrentDay.getTime() && w.get("equipment_id").equals(equipmentId)).collect(Collectors.toList());
  1929. //只取上一个小时的数据
  1930. int curentHour = startTimeOfCurrentDay.getHours();
  1931. //构造当前小时的风速map 以层高和分钟,日为key,风速为value
  1932. for (Map<String, Object> map : collect) {
  1933. Date time = new Date(Long.parseLong(map.get("time").toString()));
  1934. if (curentHour == time.getHours()) {
  1935. //获取 毫秒数
  1936. Integer minutes = time.getMinutes();
  1937. String keyEndStr = minutes + "-" + equipmentId + "-" + DateTimeUtil.getDay(time.getTime());
  1938. if (null != map.get("abnormal_data")) {
  1939. judgeWsDataIsError(windTowerStatusDataResult, map, keyEndStr);
  1940. } else {
  1941. windTowerStatusDataResult.put("10-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave10")));
  1942. windTowerStatusDataResult.put("30-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave30")));
  1943. windTowerStatusDataResult.put("50-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave50")));
  1944. windTowerStatusDataResult.put("70-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave70")));
  1945. windTowerStatusDataResult.put("80-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave80")));
  1946. windTowerStatusDataResult.put("90-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave90")));
  1947. windTowerStatusDataResult.put("100-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave100")));
  1948. windTowerStatusDataResult.put("110-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave110")));
  1949. windTowerStatusDataResult.put("120-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave120")));
  1950. windTowerStatusDataResult.put("120A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave120A")));
  1951. windTowerStatusDataResult.put("140-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave140")));
  1952. windTowerStatusDataResult.put("140A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave140A")));
  1953. windTowerStatusDataResult.put("150-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave150")));
  1954. windTowerStatusDataResult.put("150A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave150A")));
  1955. }
  1956. }
  1957. }
  1958. return windTowerStatusDataResult;
  1959. }
  1960. /**
  1961. * 异常风速值不进行计算,忽略处理
  1962. *
  1963. * @param windTowerStatusDataResult windTowerStatusDataResult
  1964. * @param map map
  1965. * @param keyEndStr keyEndStr
  1966. */
  1967. private void judgeWsDataIsError(Map<String, BigDecimal> windTowerStatusDataResult, Map<String, Object> map, String keyEndStr) {
  1968. String abnormalType = map.get("abnormal_type").toString();
  1969. if (!abnormalType.contains("Ave10")) {
  1970. windTowerStatusDataResult.put("10-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave10")));
  1971. }
  1972. if (!abnormalType.contains("Ave30")) {
  1973. windTowerStatusDataResult.put("30-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave30")));
  1974. }
  1975. if (!abnormalType.contains("Ave50")) {
  1976. windTowerStatusDataResult.put("50-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave50")));
  1977. }
  1978. if (!abnormalType.contains("Ave70")) {
  1979. windTowerStatusDataResult.put("70-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave70")));
  1980. }
  1981. if (!abnormalType.contains("Ave80")) {
  1982. windTowerStatusDataResult.put("80-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave80")));
  1983. }
  1984. if (!abnormalType.contains("Ave90")) {
  1985. windTowerStatusDataResult.put("90-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave90")));
  1986. }
  1987. if (!abnormalType.contains("Ave100")) {
  1988. windTowerStatusDataResult.put("100-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave100")));
  1989. }
  1990. if (!abnormalType.contains("Ave110")) {
  1991. windTowerStatusDataResult.put("110-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave110")));
  1992. }
  1993. if (!abnormalType.contains("Ave120")) {
  1994. windTowerStatusDataResult.put("120-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave120")));
  1995. }
  1996. if (!abnormalType.contains("Ave120A")) {
  1997. windTowerStatusDataResult.put("120A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave120A")));
  1998. }
  1999. if (!abnormalType.contains("Ave140")) {
  2000. windTowerStatusDataResult.put("140-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave140")));
  2001. }
  2002. if (!abnormalType.contains("Ave150")) {
  2003. windTowerStatusDataResult.put("150-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave150")));
  2004. }
  2005. if (!abnormalType.contains("Ave140A")) {
  2006. windTowerStatusDataResult.put("140A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave140A")));
  2007. }
  2008. if (!abnormalType.contains("Ave150A")) {
  2009. windTowerStatusDataResult.put("150A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave150A")));
  2010. }
  2011. }
  2012. /**
  2013. * 以10米风速为基准 计算层高风切变指数
  2014. *
  2015. * @param keys keys
  2016. * @param ws ws
  2017. * @param windTowerShearMap 各层高风切结果集
  2018. * @param map
  2019. */
  2020. private void calculateShearByHeight10(String[] keys, BigDecimal ws, Map<String, List<BigDecimal>> windTowerShearMap, Map<String, BigDecimal> map, Integer heightMin) {
  2021. String height = keys[0];
  2022. String MINUTE = keys[1];
  2023. String equipmentId = keys[2];
  2024. String day = keys[3];
  2025. String keyEndStr = MINUTE + "-" + equipmentId + "-" + day;
  2026. String key = height + "-00-" + equipmentId;
  2027. //10米风速
  2028. BigDecimal wsMin = Convert.toBigDecimal(map.get(heightMin + "-" + keyEndStr));
  2029. //计算各风速风切变
  2030. BigDecimal shear = BigDecimal.ZERO;
  2031. if (wsMin != null) {
  2032. double z = new BigDecimal(getNumberFromString(height)).divide(new BigDecimal(heightMin), 4, RoundingMode.HALF_UP).doubleValue();
  2033. double z1 = Math.log10(z);
  2034. shear = Convert.toBigDecimal(Math.log10(Convert.toDouble(ws.divide(wsMin, 8, RoundingMode.HALF_UP))))
  2035. .divide(BigDecimal.valueOf(z1), 8, RoundingMode.HALF_UP);
  2036. }
  2037. //将计算的风切变结果放入结果集合中
  2038. if (null != windTowerShearMap.get(key)) {
  2039. List<BigDecimal> list = windTowerShearMap.get(key);
  2040. list.add(shear);
  2041. } else {
  2042. List<BigDecimal> list = new ArrayList<>();
  2043. list.add(shear);
  2044. windTowerShearMap.put(key, list);
  2045. }
  2046. }
  2047. /**
  2048. * 计算月平均风速标差
  2049. *
  2050. * @param startTime 开始时间
  2051. * @param endTime 结束时间
  2052. * @param equipmentId 设备id
  2053. * @return
  2054. */
  2055. public ArrayList<WindTowerCalculationData> staMonth(Date startTime, Date endTime, String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  2056. //时间-1防止0点数据查不到
  2057. Date startHour = new Date(startTime.getTime() - 1);
  2058. List<ProphaseAnemometryData> collect = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startTime.getTime() && p.getTs().getTime() <= endTime.getTime() && p.getWsSta() != null && p.getWsSta() > 0).collect(Collectors.toList());
  2059. ArrayList<WindTowerCalculationData> windTowerCalculationDataList = new ArrayList<>();
  2060. String h = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights();
  2061. String[] heights = h.split(",");
  2062. //计算标差
  2063. for (String height : heights) {
  2064. List<EquipmentAttribute> equipmentAttributeList1 = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(height + "staMonth")).collect(Collectors.toList());
  2065. if (!collect.isEmpty()) {
  2066. BigDecimal sumSta = CalculationUtil.getBigDecimal(collect.stream().filter(c -> c.getWsSta() != null && c.getLayerHeight().equals(height)).mapToDouble(ProphaseAnemometryData::getWsSta).sum());
  2067. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  2068. windTowerCalculationData.setEbId(equipmentAttributeList1.get(0).getId());
  2069. windTowerCalculationData.setTime(startHour);
  2070. windTowerCalculationData.setValue(sumSta.divide(new BigDecimal(collect.size()), 2, RoundingMode.HALF_UP));
  2071. windTowerCalculationData.setEquipmentId(equipmentId);
  2072. windTowerCalculationDataList.add(windTowerCalculationData);
  2073. }
  2074. }
  2075. List<EquipmentAttribute> equipmentAttributeList1 = equipmentAttributeList.stream().filter(e -> "staMonth".equals(e.getAttributeFunction())).collect(Collectors.toList());
  2076. for (EquipmentAttribute e : equipmentAttributeList1) {
  2077. List<WindTowerCalculationData> windTowerCalculationDataList1 = getByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, e.getId());
  2078. if (!windTowerCalculationDataList1.isEmpty()) {
  2079. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, e.getId());
  2080. }
  2081. }
  2082. // saveBatchByEquipmentId(windTowerCalculationDataList, equipmentId);
  2083. return windTowerCalculationDataList;
  2084. }
  2085. /**
  2086. * @param startTime 开始时间
  2087. * @param endTime 结束时间
  2088. * @param equipmentId 设备id
  2089. * @param equipmentAttributeList 属性集合
  2090. * @return
  2091. */
  2092. public ArrayList<WindTowerCalculationData> environmentData(Date startTime, Date endTime, String equipmentId, List<ProphaseWeatherData> prophaseWeatherDataList, List<EquipmentAttribute> equipmentAttributeList) {
  2093. ArrayList<WindTowerCalculationData> windTowerCalculationDataList = null;
  2094. try {
  2095. //时间-1防止0点数据查不到
  2096. Date startHour = new Date(startTime.getTime() - 1);
  2097. // List<Map<String, Object>> collect = mapList.stream().filter(w -> Long.parseLong(w.get("time").toString()) >= startHour.getTime() && Long.parseLong(w.get("time").toString()) <= endTime.getTime() && w.get("equipment_id").equals(equipmentId)).collect(Collectors.toList());
  2098. List<ProphaseWeatherData> prophaseWeatherData = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startHour.getTime() && p.getTs().getTime() <= endTime.getTime()).collect(Collectors.toList());
  2099. List<EquipmentAttribute> equipmentAttributes = equipmentAttributeList.stream().filter(w -> "environment".equals(w.getAttributeFunction())).collect(Collectors.toList());
  2100. BigDecimal sumPa = new BigDecimal(0);
  2101. BigDecimal avePa = new BigDecimal(0);
  2102. BigDecimal sumRh = new BigDecimal(0);
  2103. BigDecimal aveRh = new BigDecimal(0);
  2104. BigDecimal sumT = new BigDecimal(0);
  2105. BigDecimal aveT = new BigDecimal(0);
  2106. windTowerCalculationDataList = new ArrayList<>();
  2107. if (!prophaseWeatherData.isEmpty()) {
  2108. List<BigDecimal> paList = new ArrayList<>();
  2109. List<BigDecimal> rhList = new ArrayList<>();
  2110. List<BigDecimal> tList = new ArrayList<>();
  2111. /*计算平均值数值为null 不计算*/
  2112. for (ProphaseWeatherData map : prophaseWeatherData) {
  2113. if (map.getPaAve() != null && map.getPaAve() > 0) {
  2114. paList.add(CalculationUtil.getBigDecimal(map.getPaAve()));
  2115. }
  2116. if (map.getRhAve() != null && map.getRhAve() > 0) {
  2117. rhList.add(CalculationUtil.getBigDecimal(map.getRhAve()));
  2118. }
  2119. if (map.getTAve() != null && map.getTAve() != -99) {
  2120. tList.add(CalculationUtil.getBigDecimal(map.getTAve()));
  2121. }
  2122. }
  2123. /*气压*/
  2124. BigDecimal maxPa = new BigDecimal(0);
  2125. BigDecimal minPa = new BigDecimal(0);
  2126. if (!paList.isEmpty()) {
  2127. maxPa = paList.stream().max(BigDecimal::compareTo).get();
  2128. minPa = paList.stream().min(BigDecimal::compareTo).get();
  2129. for (BigDecimal pa : paList) {
  2130. sumPa = sumPa.add(pa);
  2131. }
  2132. avePa = sumPa.divide(new BigDecimal(paList.size()), 2, RoundingMode.HALF_UP);
  2133. }
  2134. /*温度*/
  2135. BigDecimal maxT = new BigDecimal(0);
  2136. BigDecimal minT = new BigDecimal(0);
  2137. if (!tList.isEmpty()) {
  2138. maxT = tList.stream().max(BigDecimal::compareTo).get();
  2139. minT = tList.stream().min(BigDecimal::compareTo).get();
  2140. for (BigDecimal t : tList) {
  2141. sumT = sumT.add(t);
  2142. }
  2143. aveT = sumT.divide(new BigDecimal(tList.size()), 2, RoundingMode.HALF_UP);
  2144. }
  2145. /*湿度*/
  2146. BigDecimal maxRh = new BigDecimal(0);
  2147. BigDecimal minRh = new BigDecimal(0);
  2148. if (!rhList.isEmpty()) {
  2149. maxRh = rhList.stream().max(BigDecimal::compareTo).get();
  2150. minRh = rhList.stream().min(BigDecimal::compareTo).get();
  2151. for (BigDecimal rh : rhList) {
  2152. sumRh = sumRh.add(rh);
  2153. }
  2154. aveRh = sumRh.divide(new BigDecimal(rhList.size()), 2, RoundingMode.HALF_UP);
  2155. }
  2156. List<EquipmentAttribute> paMax = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("paMAX")).collect(Collectors.toList());
  2157. List<EquipmentAttribute> paMin = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("paMIN")).collect(Collectors.toList());
  2158. List<EquipmentAttribute> paAve = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("paAVE")).collect(Collectors.toList());
  2159. List<EquipmentAttribute> rhMax = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("rhMAX")).collect(Collectors.toList());
  2160. List<EquipmentAttribute> rhMin = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("rhMIN")).collect(Collectors.toList());
  2161. List<EquipmentAttribute> rhAve = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("rhAVE")).collect(Collectors.toList());
  2162. List<EquipmentAttribute> tMax = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("tMAX")).collect(Collectors.toList());
  2163. List<EquipmentAttribute> tMin = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("tMIN")).collect(Collectors.toList());
  2164. List<EquipmentAttribute> tAve = equipmentAttributes.stream().filter(w -> w.getFieldName().equals("tAVE")).collect(Collectors.toList());
  2165. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, paMax.get(0).getId());
  2166. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, paMin.get(0).getId());
  2167. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, paAve.get(0).getId());
  2168. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, rhMax.get(0).getId());
  2169. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, rhMin.get(0).getId());
  2170. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, rhAve.get(0).getId());
  2171. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, tMax.get(0).getId());
  2172. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, tMin.get(0).getId());
  2173. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, tAve.get(0).getId());
  2174. WindTowerCalculationData paMaxData = new WindTowerCalculationData();
  2175. paMaxData.setEbId(paMax.get(0).getId());
  2176. paMaxData.setValue(maxPa);
  2177. paMaxData.setTime(startTime);
  2178. paMaxData.setEquipmentId(equipmentId);
  2179. WindTowerCalculationData paMinData = new WindTowerCalculationData();
  2180. paMinData.setEbId(paMin.get(0).getId());
  2181. paMinData.setValue(minPa);
  2182. paMinData.setTime(startTime);
  2183. paMinData.setEquipmentId(equipmentId);
  2184. WindTowerCalculationData paAveData = new WindTowerCalculationData();
  2185. paAveData.setEbId(paAve.get(0).getId());
  2186. paAveData.setValue(avePa);
  2187. paAveData.setTime(startTime);
  2188. paAveData.setEquipmentId(equipmentId);
  2189. WindTowerCalculationData rhMaxData = new WindTowerCalculationData();
  2190. rhMaxData.setEbId(rhMax.get(0).getId());
  2191. rhMaxData.setValue(maxRh);
  2192. rhMaxData.setTime(startTime);
  2193. rhMaxData.setEquipmentId(equipmentId);
  2194. WindTowerCalculationData rhMinData = new WindTowerCalculationData();
  2195. rhMinData.setEbId(rhMin.get(0).getId());
  2196. rhMinData.setValue(minRh);
  2197. rhMinData.setTime(startTime);
  2198. rhMinData.setEquipmentId(equipmentId);
  2199. WindTowerCalculationData rhAveData = new WindTowerCalculationData();
  2200. rhAveData.setEbId(rhAve.get(0).getId());
  2201. rhAveData.setValue(aveRh);
  2202. rhAveData.setTime(startTime);
  2203. rhAveData.setEquipmentId(equipmentId);
  2204. WindTowerCalculationData tMaxData = new WindTowerCalculationData();
  2205. tMaxData.setEbId(tMax.get(0).getId());
  2206. tMaxData.setValue(maxT);
  2207. tMaxData.setTime(startTime);
  2208. tMaxData.setEquipmentId(equipmentId);
  2209. WindTowerCalculationData tMinData = new WindTowerCalculationData();
  2210. tMinData.setEbId(tMin.get(0).getId());
  2211. tMinData.setValue(minT);
  2212. tMinData.setTime(startTime);
  2213. tMinData.setEquipmentId(equipmentId);
  2214. WindTowerCalculationData tAveData = new WindTowerCalculationData();
  2215. tAveData.setEbId(tAve.get(0).getId());
  2216. tAveData.setValue(aveT);
  2217. tAveData.setTime(startTime);
  2218. tAveData.setEquipmentId(equipmentId);
  2219. windTowerCalculationDataList.add(paAveData);
  2220. windTowerCalculationDataList.add(paMaxData);
  2221. windTowerCalculationDataList.add(paMinData);
  2222. windTowerCalculationDataList.add(rhAveData);
  2223. windTowerCalculationDataList.add(rhMaxData);
  2224. windTowerCalculationDataList.add(rhMinData);
  2225. windTowerCalculationDataList.add(tAveData);
  2226. windTowerCalculationDataList.add(tMaxData);
  2227. windTowerCalculationDataList.add(tMinData);
  2228. // saveBatchByEquipmentId(windTowerCalculationDataList, equipmentId);
  2229. }
  2230. } catch (Exception e) {
  2231. e.printStackTrace();
  2232. }
  2233. return windTowerCalculationDataList;
  2234. }
  2235. /**
  2236. * 湍流月逐时
  2237. *
  2238. * @param equipmentId 设备Id
  2239. * @param startTime 开始时间
  2240. * @param endTime 结束时间
  2241. * @param equipmentAttributeList 属性集合
  2242. * @param windTowerInfoList 测风塔信息
  2243. * @return
  2244. */
  2245. public ArrayList<WindTowerCalculationData> turbulenceHourForMonth(String equipmentId, Date startTime, Date endTime, List<ProphaseAnemometryData> prophaseAnemometryDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  2246. String height = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights();
  2247. String[] heights = height.split(",");
  2248. long hour = 3600000L;
  2249. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  2250. try {
  2251. //遍历层高
  2252. for (String h : heights) {
  2253. //获取湍流年逐时ebId
  2254. String ebId = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(h + "turDayForMonth")).collect(Collectors.toList()).get(0).getId();
  2255. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebId);
  2256. HashMap<Integer, BigDecimal> timeAndTurMap = new HashMap<>();
  2257. HashMap<Integer, BigDecimal> totalAndTurMap = new HashMap<>();
  2258. //循环开始时间到时间一小时为间隔
  2259. for (long time = startTime.getTime(); time <= endTime.getTime(); time = time + hour) {
  2260. long startHour = time;
  2261. long endHour = time + hour;
  2262. //筛选小时数据
  2263. // List<Map<String, Object>> collect = mapList.stream().filter(w -> Long.parseLong(w.get("time").toString()) >= startHour && Long.parseLong(w.get("time").toString()) <= endHour && w.get("equipment_id").equals(equipmentId)).collect(Collectors.toList());
  2264. List<ProphaseAnemometryData> anemometryDataList = prophaseAnemometryDataList.stream().filter(p -> p.getTs().getTime() >= startHour && p.getTs().getTime() <= endHour && p.getLayerHeight().equals(h)
  2265. && p.getWsAve() != null && p.getWsAve() != -99
  2266. && p.getWsSta() != null && p.getWsSta() != -99).collect(Collectors.toList());
  2267. if (anemometryDataList.size() > 0) {
  2268. BigDecimal turAve = BigDecimal.ZERO;
  2269. //循环实时数据计算总风速和标差
  2270. BigDecimal wsSun = CalculationUtil.getBigDecimal(anemometryDataList.stream().mapToDouble(ProphaseAnemometryData::getWsAve).sum());
  2271. BigDecimal staSun = CalculationUtil.getBigDecimal(anemometryDataList.stream().mapToDouble(ProphaseAnemometryData::getWsSta).sum());
  2272. //除以一小时的个数 求小时的平均值
  2273. BigDecimal wsAve = wsSun.divide(BigDecimal.valueOf(anemometryDataList.size()), 2, RoundingMode.HALF_UP);
  2274. BigDecimal staAve = staSun.divide(BigDecimal.valueOf(anemometryDataList.size()), 2, RoundingMode.HALF_UP);
  2275. //如果除数等于0就跳过本次循环
  2276. if (wsAve.compareTo(BigDecimal.ZERO) == 0 || staAve.compareTo(BigDecimal.ZERO) == 0) {
  2277. continue;
  2278. }
  2279. turAve = staAve.divide(wsAve, 2, RoundingMode.HALF_UP);
  2280. //判断map中是否存在此小时的key 如果存在就把数值相加 个数加一
  2281. if (timeAndTurMap.get(new Date(startHour).getHours()) != null) {
  2282. BigDecimal Average = timeAndTurMap.get(new Date(startHour).getHours()).add(turAve);
  2283. BigDecimal total = totalAndTurMap.get(new Date(startHour).getHours()).add(BigDecimal.ONE);
  2284. timeAndTurMap.put(new Date(startHour).getHours(), Average);
  2285. totalAndTurMap.put(new Date(startHour).getHours(), total);
  2286. } else {
  2287. //如果map中不存在这个key则直接把平均值加入 个数加一
  2288. timeAndTurMap.put(new Date(startHour).getHours(), turAve);
  2289. totalAndTurMap.put(new Date(startHour).getHours(), BigDecimal.ONE);
  2290. }
  2291. }
  2292. }
  2293. if (!timeAndTurMap.entrySet().isEmpty()) {
  2294. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
  2295. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");
  2296. //设置数据时间为开始时间
  2297. String start = sdf1.format(new Date(startTime.getTime()));
  2298. for (Map.Entry<Integer, BigDecimal> a : timeAndTurMap.entrySet()) {
  2299. Date timeMonth = sdf.parse(start + String.valueOf(a.getKey()));
  2300. BigDecimal airAve = a.getValue().divide(totalAndTurMap.get(a.getKey()), 2, RoundingMode.HALF_UP);
  2301. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  2302. windTowerCalculationData.setEbId(ebId);
  2303. windTowerCalculationData.setTime(timeMonth);
  2304. windTowerCalculationData.setEquipmentId(equipmentId);
  2305. windTowerCalculationData.setValue(airAve);
  2306. list.add(windTowerCalculationData);
  2307. }
  2308. }
  2309. }
  2310. } catch (ParseException e) {
  2311. log.error("设备编号{},湍流年逐时计算错误", equipmentId);
  2312. e.printStackTrace();
  2313. }
  2314. // saveBatchByEquipmentId(list, equipmentId);
  2315. log.info("设备编号{},湍流年逐时,计算完成", equipmentId);
  2316. return list;
  2317. }
  2318. /**
  2319. * 空气密度月逐时入库
  2320. *
  2321. * @param equipmentId 设备id
  2322. * @param startTime 开始时间
  2323. * @param endTime 结束时间
  2324. * @return
  2325. */
  2326. public ArrayList<WindTowerCalculationData> airDensityMonth(String equipmentId, Date startTime, Date endTime, List<ProphaseWeatherData> prophaseWeatherDataList) {
  2327. //获取ebId
  2328. String ebId = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, "airDensityDayForYear").list().get(0).getId();
  2329. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, new Date(endTime.getTime() + 86400000L), equipmentId, ebId);
  2330. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  2331. long hour = 3600000L;
  2332. try {
  2333. HashMap<Integer, BigDecimal> timeAndAirMap = new HashMap<>();
  2334. HashMap<Integer, BigDecimal> totalAndAirMap = new HashMap<>();
  2335. for (long time = startTime.getTime(); time <= endTime.getTime(); time = time + hour) {
  2336. BigDecimal airSun = BigDecimal.ZERO;
  2337. long startHour = time;
  2338. long endHour = time + hour;
  2339. // List<Map<String, Object>> collect = mapList.stream().filter(w -> Long.parseLong(w.get("time").toString()) >= startHour && Long.parseLong(w.get("time").toString()) <= endHour && w.get("equipment_id").equals(equipmentId)).collect(Collectors.toList());
  2340. List<ProphaseWeatherData> weatherDataList = prophaseWeatherDataList.stream().filter(p -> p.getTs().getTime() >= startHour && p.getTs().getTime() <= endHour && p.getAirDensity() != null && p.getAirDensity() > 0).collect(Collectors.toList());
  2341. for (ProphaseWeatherData map : weatherDataList) {
  2342. //过滤异常数据
  2343. airSun = airSun.add(CalculationUtil.getBigDecimal(map.getAirDensity()));
  2344. }
  2345. if (weatherDataList.size() > 0) {
  2346. BigDecimal airAve = airSun.divide(BigDecimal.valueOf(weatherDataList.size()), 2, RoundingMode.HALF_UP);
  2347. //判断map的key是否包含此小时 不包含直接加入value中 包含则相加
  2348. if (timeAndAirMap.get(new Date(startHour).getHours()) != null) {
  2349. BigDecimal Average = timeAndAirMap.get(new Date(startHour).getHours()).add(airAve);
  2350. BigDecimal total = totalAndAirMap.get(new Date(startHour).getHours()).add(BigDecimal.ONE);
  2351. timeAndAirMap.put(new Date(startHour).getHours(), Average);
  2352. totalAndAirMap.put(new Date(startHour).getHours(), total);
  2353. } else {
  2354. //如果map中不存在这个key则直接把平均值加入个数加一
  2355. timeAndAirMap.put(new Date(startHour).getHours(), airAve);
  2356. totalAndAirMap.put(new Date(startHour).getHours(), BigDecimal.ONE);
  2357. }
  2358. }
  2359. }
  2360. if (!timeAndAirMap.entrySet().isEmpty()) {
  2361. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
  2362. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");
  2363. //设置数据时间为开始时间
  2364. String start = sdf1.format(new Date(startTime.getTime()));
  2365. for (Map.Entry<Integer, BigDecimal> a : timeAndAirMap.entrySet()) {
  2366. //拼接时间
  2367. Date time = sdf.parse(start + String.valueOf(a.getKey()));
  2368. BigDecimal airAve = a.getValue().divide(totalAndAirMap.get(a.getKey()), 2, RoundingMode.HALF_UP);
  2369. WindTowerCalculationData windTowerCalculationData = new WindTowerCalculationData();
  2370. windTowerCalculationData.setEbId(ebId);
  2371. windTowerCalculationData.setTime(time);
  2372. windTowerCalculationData.setEquipmentId(equipmentId);
  2373. windTowerCalculationData.setValue(airAve);
  2374. list.add(windTowerCalculationData);
  2375. }
  2376. }
  2377. } catch (Exception e) {
  2378. log.error("设备编号{},空气密度月逐时计算错误", equipmentId);
  2379. e.printStackTrace();
  2380. }
  2381. // saveBatchByEquipmentId(list, equipmentId);
  2382. log.info("设备编号{},空气密度月逐时,计算完成", equipmentId);
  2383. return list;
  2384. }
  2385. /**
  2386. * 根据时间范围 设备id 属性id删除
  2387. *
  2388. * @param equipmentId 设备id
  2389. * @param ebId 属性id
  2390. * @return List<WindTowerCalculationData>
  2391. */
  2392. public List<WindTowerCalculationData> findByEquipmentIdAndEbId(String equipmentId, String ebId) {
  2393. Map<String, Object> map = new HashMap<>();
  2394. map.put("equipment_id", equipmentId);
  2395. RequestDataHelper.setRequestData(map);
  2396. QueryWrapper<WindTowerCalculationData> wrapper = new QueryWrapper();
  2397. if (equipmentId != null && !equipmentId.equals("")) {
  2398. wrapper.eq("equipment_id", equipmentId);
  2399. }
  2400. if (ebId != null && !ebId.equals("")) {
  2401. wrapper.eq("eb_id", ebId);
  2402. }
  2403. return baseMapper.selectList(wrapper);
  2404. }
  2405. /**
  2406. * 根据时间范围和设备id查询数据
  2407. *
  2408. * @param equipmentId 设备属性id
  2409. * @return List<WindTowerCalculationData>
  2410. */
  2411. public List<WindTowerCalculationData> getByBetweenTimeAndEquipmentId(Date startTime, Date endTime, String equipmentId) {
  2412. Map<String, Object> map = new HashMap<>();
  2413. map.put("equipment_id", equipmentId);
  2414. RequestDataHelper.setRequestData(map);
  2415. QueryWrapper<WindTowerCalculationData> wrapper = new QueryWrapper();
  2416. if (startTime != null && endTime != null) {
  2417. wrapper.between("time", startTime, endTime);
  2418. }
  2419. if (equipmentId != null && !equipmentId.equals("")) {
  2420. wrapper.eq("equipment_id", equipmentId);
  2421. }
  2422. return baseMapper.selectList(wrapper);
  2423. }
  2424. //根据ebId集合、时间、设备编号查询
  2425. public List<WindTowerCalculationData> getByBetweenTimeAndEquipmentIdAndEbId(Date startTime, Date endTime, String equipmentId, List<EquipmentAttribute> equipmentAttributeList) {
  2426. LambdaQueryWrapper<WindTowerCalculationData> wrapper = Wrappers.lambdaQuery();
  2427. Map<String, Object> map = new HashMap<>();
  2428. map.put("equipment_id", equipmentId);
  2429. RequestDataHelper.setRequestData(map);
  2430. wrapper.eq(WindTowerCalculationData::getEquipmentId, equipmentId);
  2431. wrapper.between(WindTowerCalculationData::getTime, startTime, endTime);
  2432. for (EquipmentAttribute equipmentAttribute : equipmentAttributeList) {
  2433. wrapper.eq(WindTowerCalculationData::getEbId, equipmentAttribute.getId()).or();
  2434. }
  2435. return baseMapper.selectList(wrapper);
  2436. }
  2437. public void saveByEquipmentId(WindTowerCalculationData windTowerCalculationData, String equipmentId) {
  2438. Map<String, Object> map = new HashMap<>();
  2439. map.put("equipment_id", equipmentId);
  2440. RequestDataHelper.setRequestData(map);
  2441. this.save(windTowerCalculationData);
  2442. }
  2443. public void saveBatchByEquipmentId(List<WindTowerCalculationData> windTowerCalculationDataList, String equipmentId) {
  2444. Map<String, Object> map = new HashMap<>();
  2445. map.put("equipment_id", equipmentId);
  2446. RequestDataHelper.setRequestData(map);
  2447. this.saveBatch(windTowerCalculationDataList);
  2448. }
  2449. /**
  2450. * 根据时间范围 设备id 属性id删除
  2451. *
  2452. * @param startTime 开始时间
  2453. * @param endTime 结束时间
  2454. * @param equipmentId 设备id
  2455. * @param ebId 属性id
  2456. */
  2457. public void removeByStartTimeBetweenAndEquipmentIdAndEbId(Date startTime, Date endTime, String equipmentId, String ebId) {
  2458. Map<String, Object> map = new HashMap<>();
  2459. map.put("equipment_id", equipmentId);
  2460. RequestDataHelper.setRequestData(map);
  2461. QueryWrapper<WindTowerCalculationData> wrapper = new QueryWrapper();
  2462. if (startTime != null && endTime != null) {
  2463. wrapper.between("time", startTime, endTime);
  2464. }
  2465. if (equipmentId != null && !equipmentId.equals("")) {
  2466. wrapper.eq("equipment_id", equipmentId);
  2467. }
  2468. if (ebId != null && !ebId.equals("")) {
  2469. wrapper.eq("eb_id", ebId);
  2470. }
  2471. remove(wrapper);
  2472. }
  2473. /**
  2474. * 根据时间范围 设备id 属性id查询
  2475. *
  2476. * @param startTime 开始时间
  2477. * @param endTime 结束时间
  2478. * @param equipmentId 设备id
  2479. * @param ebId 属性id
  2480. * @return List<WindTowerCalculationData>
  2481. */
  2482. public List<WindTowerCalculationData> getByStartTimeBetweenAndEquipmentIdAndEbId(Date startTime, Date endTime, String equipmentId, String ebId) {
  2483. Map<String, Object> map = new HashMap<>();
  2484. map.put("equipment_id", equipmentId);
  2485. RequestDataHelper.setRequestData(map);
  2486. QueryWrapper<WindTowerCalculationData> wrapper = new QueryWrapper();
  2487. if (startTime != null && endTime != null) {
  2488. wrapper.between("time", startTime, endTime);
  2489. }
  2490. if (equipmentId != null && !equipmentId.equals("")) {
  2491. wrapper.eq("equipment_id", equipmentId);
  2492. }
  2493. if (ebId != null && !ebId.equals("")) {
  2494. wrapper.eq("eb_id", ebId);
  2495. }
  2496. return baseMapper.selectList(wrapper);
  2497. }
  2498. /**
  2499. * 从 String 中提取数字
  2500. *
  2501. * @param string
  2502. * @return
  2503. */
  2504. public static String getNumberFromString(String string) {
  2505. String str = string;
  2506. str = str.trim();
  2507. StringBuffer str2 = new StringBuffer();
  2508. if (str != null && !"".equals(str)) {
  2509. for (int i = 0; i < str.length(); i++) {
  2510. if (str.charAt(i) >= 48 && str.charAt(i) <= 57) {
  2511. String s = String.valueOf(str.charAt(i));
  2512. str2.append(s);
  2513. }
  2514. }
  2515. }
  2516. return str2.toString();
  2517. }
  2518. /**
  2519. * 根据设备编号获取该设备的最后一条统计数据
  2520. *
  2521. * @param equipmentId 设备编号
  2522. * @return WindTowerCalculationData
  2523. */
  2524. public WindTowerCalculationData getLastDataCalculation(String equipmentId) {
  2525. return baseMapper.getLastData(equipmentId);
  2526. }
  2527. }