WindTowerCalculationDataServiceImpl.java 152 KB

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