WindTowerCalculationDataServiceImpl.java 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436
  1. package com.jiayue.biz.service.impl;
  2. import cn.hutool.core.convert.Convert;
  3. import cn.hutool.core.date.DateTime;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.jiayue.biz.conf.RequestDataHelper;
  9. import com.jiayue.biz.domain.EquipmentAttribute;
  10. import com.jiayue.biz.domain.ProphaseAnemometryData;
  11. import com.jiayue.biz.domain.WindTowerCalculationData;
  12. import com.jiayue.biz.domain.WindTowerInfo;
  13. import com.jiayue.biz.mapper.WindTowerCalculationDataMapper;
  14. import com.jiayue.biz.service.EquipmentAttributeService;
  15. import com.jiayue.biz.service.WindTowerCalculationDataService;
  16. import com.jiayue.biz.service.WindTowerInfoService;
  17. import com.jiayue.biz.util.CalculationUtil;
  18. import com.jiayue.biz.util.DateTimeUtil;
  19. import com.jiayue.biz.util.SEDateUtil;
  20. import com.jiayue.common.utils.DateUtil;
  21. import flanagan.analysis.ProbabilityPlot;
  22. import lombok.AllArgsConstructor;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.springframework.stereotype.Service;
  25. import java.math.BigDecimal;
  26. import java.math.RoundingMode;
  27. import java.text.SimpleDateFormat;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. /**
  31. * 统计数据实现类
  32. *
  33. * @author zy
  34. * @date 2022-08-26
  35. */
  36. @Slf4j
  37. @Service
  38. @AllArgsConstructor
  39. public class WindTowerCalculationDataServiceImpl extends ServiceImpl<WindTowerCalculationDataMapper, WindTowerCalculationData> implements WindTowerCalculationDataService {
  40. //风功率密度和平均风速的统一标识
  41. private final String attributeFunction = "WindPowerDensity";
  42. private final String shearFunction = "shear";
  43. private final String turbulenceFunction = "turbulence";
  44. private final String wsFunction = "ws";
  45. private final String wsDayFunction = "wsDay";
  46. private final String wsMonthFunction = "wsMonth";
  47. private final String wpdFunction = "WindPowerDensity";
  48. private final String wsMaxMonthFunction = "maxWsMonth";
  49. private final String turbulenceDay = "turbulenceDay";
  50. private final String staDay = "staDay";
  51. private final String windShearFiledName = "windShear";
  52. private final String windShearDayFiledName = "windShearDay";
  53. //风切变计算指数
  54. private final BigDecimal lg30 = new BigDecimal("0.47712125471966244");//lg(30/10)
  55. private final BigDecimal lg50 = new BigDecimal("0.6989700043360189");//lg(50/10)
  56. private final BigDecimal lg60 = new BigDecimal("0.7781512503836436");//lg(60/10)
  57. private final BigDecimal lg70 = new BigDecimal("0.8450980400142568");//lg(70/10)
  58. private final BigDecimal lg80 = new BigDecimal("0.9030899869919435");//lg(80/10)
  59. private final BigDecimal lg90 = new BigDecimal("0.9542425094393249");//lg(90/10)
  60. private final BigDecimal lg100 = new BigDecimal("1.0");//lg(100/10)
  61. private final BigDecimal lg110 = new BigDecimal("1.0413926851582251");//lg(110/10)
  62. private final BigDecimal lg120 = new BigDecimal("1.0791812460476249");//lg(120/10)
  63. private final BigDecimal lg140 = new BigDecimal("1.146128035678238");//lg(140/10)
  64. private final BigDecimal lg150 = new BigDecimal("1.1760912590556813");//lg(150/10)
  65. private final WindTowerInfoService windTowerInfoService;
  66. private final EquipmentAttributeService equipmentAttributeService;
  67. /**
  68. * 威布尔AK计算
  69. *
  70. * @param startTime 开始时间
  71. * @param endTime 结束时间
  72. * @param equipmentId 测风塔Id
  73. * @param windTowerCalculationDataList 统计库数据
  74. * @param equipmentAttributeList 统计表数据
  75. * @param windTowerInfoList 测风塔表数据
  76. */
  77. public void statisticsWeiBullForAKForYear(Date startTime, Date endTime, String equipmentId, List<WindTowerCalculationData> windTowerCalculationDataList, List<EquipmentAttribute> equipmentAttributeList, List<WindTowerInfo> windTowerInfoList) {
  78. //获取时间段测风塔数据
  79. List<WindTowerCalculationData> windTowerCalculationDataList1 = getByBetweenTimeAndEquipmentId(startTime, endTime, equipmentId);
  80. String[] heights = windTowerInfoList.stream().filter(w -> w.getEquipmentNo().equals(equipmentId)).collect(Collectors.toList()).get(0).getHeights().split(",");
  81. //存数据用的集合
  82. ArrayList<WindTowerCalculationData> list = new ArrayList<>();
  83. //遍历层高
  84. try {
  85. for (String h : heights) {
  86. ArrayList<Object> wsList = new ArrayList<>();
  87. //获取AK的ebId 以及小时风速id
  88. String ebIdA = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(h + "weibullA")).collect(Collectors.toList()).get(0).getId();
  89. String ebIdK = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(h + "weibullK")).collect(Collectors.toList()).get(0).getId();
  90. String id = equipmentAttributeList.stream().filter(e -> e.getFieldName().equals(h + "aws")).collect(Collectors.toList()).get(0).getId();
  91. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdK);
  92. removeByStartTimeBetweenAndEquipmentIdAndEbId(startTime, endTime, equipmentId, ebIdA);
  93. List<WindTowerCalculationData> windTowerCalculationDataWsList = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(id)).collect(Collectors.toList());
  94. for (WindTowerCalculationData w : windTowerCalculationDataWsList) {
  95. if (w.getValue() != null) {
  96. wsList.add(w.getValue());
  97. }
  98. }
  99. if (!wsList.isEmpty()) {
  100. //放入风速集合
  101. ProbabilityPlot probabilityPlot = new ProbabilityPlot(wsList);
  102. probabilityPlot.suppressDisplay();
  103. //计算AK
  104. double K = probabilityPlot.weibullTwoParGamma();
  105. double A = probabilityPlot.weibullTwoParSigma();
  106. WindTowerCalculationData windTowerCalculationDataK = new WindTowerCalculationData();
  107. windTowerCalculationDataK.setValue(BigDecimal.valueOf(K));
  108. windTowerCalculationDataK.setEbId(ebIdK);
  109. windTowerCalculationDataK.setTime(DateUtil.beginOfDay(new Date(startTime.getTime() + 86400000 * 2)));
  110. windTowerCalculationDataK.setEquipmentId(equipmentId);
  111. WindTowerCalculationData windTowerCalculationDataA = new WindTowerCalculationData();
  112. windTowerCalculationDataA.setValue(BigDecimal.valueOf(A));
  113. windTowerCalculationDataA.setEbId(ebIdA);
  114. windTowerCalculationDataA.setTime(DateUtil.beginOfDay(new Date(startTime.getTime() + 86400000 * 2)));
  115. windTowerCalculationDataA.setEquipmentId(equipmentId);
  116. list.add(windTowerCalculationDataK);
  117. list.add(windTowerCalculationDataA);
  118. } else {
  119. log.info("缺少风速数据,无法计算威布尔AK值");
  120. }
  121. }
  122. } catch (NumberFormatException e) {
  123. log.error("威布尔AK计算异常");
  124. e.printStackTrace();
  125. }
  126. saveBatchByEquipmentId(list, equipmentId);
  127. log.info("设备{},威布尔AK计算成功", equipmentId);
  128. }
  129. /**
  130. * 根据 时间,层高,设备id 查询风切变数据
  131. *
  132. * @param startTime 开始时间
  133. * @param endTime 结束时间
  134. * @param height 层高
  135. * @param eqId 设备id
  136. * @return map: 一天一条
  137. */
  138. @Override
  139. public List<Map<String, Object>> getWindShearByEqidAndAverageAndTime(Long startTime, Long endTime, String height, String eqId) {
  140. List<Map<String, Object>> list = new ArrayList<>();
  141. List<Map<String, Object>> tableList = new ArrayList<>();
  142. Map<String, Object> map = new TreeMap<>();
  143. String shearFieldName = "windShearDay";
  144. List<EquipmentAttribute> shearFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, shearFieldName).list();
  145. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  146. if (!shearFieldNameList.isEmpty()) {
  147. String ebId = shearFieldNameList.get(0).getId(); //属性id
  148. //查询风切变 月平均数据 根据时间,层高,设备id 并根据时间升序排列
  149. List<WindTowerCalculationData> windTowerCalculationDataLists = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  150. List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataLists.stream().filter(w -> null != w.getValue() && w.getValue().doubleValue() >= 0 && ebId.equals(w.getEbId())).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  151. BigDecimal sum = BigDecimal.ZERO;
  152. BigDecimal avgShear = BigDecimal.ZERO;
  153. if (!windTowerCalculationDataList.isEmpty()) {
  154. for (WindTowerCalculationData windTowerCalculationData : windTowerCalculationDataList) {
  155. Map<String, Object> tableMap = new TreeMap<>();
  156. BigDecimal value = windTowerCalculationData.getValue().compareTo(new BigDecimal(-99)) != 0 ? windTowerCalculationData.getValue() : BigDecimal.ZERO;
  157. tableMap.put("time", sdf.format(windTowerCalculationData.getTime()));
  158. tableMap.put("windShear", value.setScale(2, RoundingMode.HALF_UP));
  159. tableList.add(tableMap);
  160. sum = sum.add(value);
  161. }
  162. if (sum.compareTo(new BigDecimal(0)) != 0) {
  163. avgShear = sum.divide(new BigDecimal(windTowerCalculationDataList.size()), 2, RoundingMode.HALF_UP);
  164. }
  165. }
  166. map.put("tableList", tableList);
  167. map.put("avgShear", avgShear);
  168. list.add(map);
  169. }
  170. return list;
  171. }
  172. /**
  173. * 空气密度曲线图
  174. *
  175. * @param startTime 开始时间
  176. * @param endTime 结束时间
  177. * @param equipmentId 设备编号
  178. * @param uid 年月区分id
  179. * @return
  180. */
  181. public List<Object> getAirDensity(Long startTime, Long endTime, String equipmentId, String uid) {
  182. ArrayList<Object> onlyData = new ArrayList<>();
  183. ArrayList<Object> list = new ArrayList<>();
  184. SimpleDateFormat day = new SimpleDateFormat("dd");
  185. SimpleDateFormat dayForYear = new SimpleDateFormat("yyyy-MM");
  186. // 若当天时间为每个月一号, 结束时间为上个月得月末时间
  187. if (day.format(new Date()).equals("01") && dayForYear.format(new Date()).equals(dayForYear.format(new Date(endTime)))) {
  188. endTime = DateTimeUtil.getDayLastTime(DateTimeUtil.mouthLastDay(1).getTime()).getTime();
  189. } else {
  190. // 若当天时间不为每个月一号,结束时间为本月的当前时间-1(昨天)
  191. endTime = DateTimeUtil.endOfMonth(new Date(endTime)).getTime();
  192. }
  193. if (uid.equals("1")) {
  194. String airDensityFieldName = "airDensity";
  195. List<EquipmentAttribute> airDayFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, airDensityFieldName).list();
  196. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  197. if (!airDayFieldNameList.isEmpty()) {
  198. String airDayEbId = airDayFieldNameList.get(0).getId();
  199. //开始时间
  200. Date startTimeOfCurrentMonth = SEDateUtil.getStartTimeOfCurrentDay(new Date(startTime));
  201. //获取所有空气密度数据
  202. List<WindTowerCalculationData> airDayList = getByStartTimeBetweenAndEquipmentIdAndEbId(startTimeOfCurrentMonth, new Date(endTime), equipmentId, airDayEbId);
  203. airDayList = airDayList.stream().sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  204. //平均空气密度的总和
  205. BigDecimal airAveSum = BigDecimal.ZERO;
  206. for (WindTowerCalculationData w : airDayList) {
  207. HashMap<Object, Object> airDayMap = new HashMap<>();
  208. airAveSum = airAveSum.add(w.getValue());
  209. String format = sdf.format(w.getTime());
  210. airDayMap.put("time", format);
  211. airDayMap.put("air", w.getValue());
  212. list.add(airDayMap);
  213. }
  214. HashMap<Object, Object> aveAirMap = new HashMap<>();
  215. if (!airDayList.isEmpty()) {
  216. aveAirMap.put("ave", airAveSum.divide(BigDecimal.valueOf(airDayList.size()), 2, RoundingMode.HALF_UP));
  217. }
  218. onlyData.add(list);
  219. onlyData.add(aveAirMap);
  220. }
  221. }
  222. if (uid.equals("2")) {
  223. //设置年份用的
  224. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  225. //给前端用的日期格式
  226. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
  227. //获取查询的年份
  228. int toYear = Integer.parseInt(sdf.format(startTime));
  229. int toYear2 = Integer.parseInt(sdf.format(endTime));
  230. Calendar calendar = Calendar.getInstance();
  231. calendar.clear();
  232. calendar.set(Calendar.YEAR, toYear);
  233. //当前年的开始时间
  234. long startHour = calendar.getTimeInMillis();
  235. //当前年的结束时间
  236. calendar.clear();
  237. calendar.set(Calendar.YEAR, toYear2);
  238. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  239. long endHour = calendar.getTimeInMillis() - 1l;
  240. String airDensityFieldName = "airDensityMonth";
  241. List<EquipmentAttribute> turDayFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, airDensityFieldName).list();
  242. if (!turDayFieldNameList.isEmpty()) {
  243. String airMonthEbId = turDayFieldNameList.get(0).getId();
  244. //开始时间
  245. Date startTimeOfCurrentMonth = SEDateUtil.getStartTimeOfCurrentDay(new Date(startHour));
  246. //结束时间
  247. Date endTimeOfCurrentMonth = SEDateUtil.getEndTimeOfCurrentDay(new Date(endHour));
  248. List<WindTowerCalculationData> airMonthList = getByStartTimeBetweenAndEquipmentIdAndEbId(startTimeOfCurrentMonth, endTimeOfCurrentMonth, equipmentId, airMonthEbId);
  249. airMonthList = airMonthList.stream().sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  250. BigDecimal airAveSum = BigDecimal.ZERO;
  251. for (WindTowerCalculationData w : airMonthList) {
  252. HashMap<Object, Object> airMonthMap = new HashMap<>();
  253. airAveSum = airAveSum.add(w.getValue());
  254. String format = sdf1.format(w.getTime());
  255. airMonthMap.put("time", format);
  256. airMonthMap.put("air", w.getValue());
  257. list.add(airMonthMap);
  258. }
  259. HashMap<Object, Object> aveAirMap = new HashMap<>();
  260. if (!airMonthList.isEmpty()) {
  261. aveAirMap.put("ave", airAveSum.divide(BigDecimal.valueOf(airMonthList.size()), 2, RoundingMode.HALF_UP));
  262. }
  263. onlyData.add(list);
  264. onlyData.add(aveAirMap);
  265. }
  266. }
  267. return onlyData;
  268. }
  269. /**
  270. * Gumbel分布概率
  271. *
  272. * @param startTime
  273. * @param endTime
  274. * @param eqId
  275. * @return
  276. */
  277. public List<Object> getGumbel(Long startTime, Long endTime, String eqId, String height) {
  278. //最终返回的集合
  279. ArrayList<Object> gumbelList = new ArrayList<>();
  280. //开始时间
  281. Date startTimeOfCurrentMonth = SEDateUtil.getStartTimeOfCurrentDay(new Date(startTime));
  282. //结束时间
  283. Date endTimeOfCurrentMonth = SEDateUtil.getEndTimeOfCurrentDay(new Date(endTime));
  284. //获取EquipmentAttribute表中的对应数据
  285. if (height == null || height.equals("")) {
  286. height = "80";
  287. }
  288. String[] heightAll = height.split(",");
  289. List<EquipmentAttribute> equipmentAttributeList1 = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getAttributeFunction, "maxWsMonth").list();
  290. List<WindTowerCalculationData> windTowerCalculationDataList1 = getByBetweenTimeAndEquipmentId(startTimeOfCurrentMonth, endTimeOfCurrentMonth, eqId);
  291. for (String h : heightAll) {
  292. //获取层高
  293. String heightGumbel = h + "maxwsMonth";
  294. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeList1.stream().filter(w -> w.getFieldName().equals(heightGumbel)).collect(Collectors.toList());
  295. //获取对应的数据
  296. List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataList1.stream().filter(w -> w.getEbId().equals(equipmentAttributeList.get(0).getId()) && w.getEquipmentId().equals(eqId) &&
  297. w.getTime().after(startTimeOfCurrentMonth) && w.getTime().before(endTimeOfCurrentMonth)).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  298. //准备放入Gumbel算法的集合
  299. ArrayList<Object> list = new ArrayList<>();
  300. for (WindTowerCalculationData windTowerCalculationData : windTowerCalculationDataList) {
  301. list.add(windTowerCalculationData.getValue().doubleValue());
  302. }
  303. if (list.size() > 5) {
  304. //把查询的最大风速集合放入公式
  305. ProbabilityPlot probabilityPlot = new ProbabilityPlot(list);
  306. probabilityPlot.suppressDisplay();
  307. //尺度参数 β
  308. double v = probabilityPlot.gumbelMaxSigma();
  309. //位置参数 α
  310. double u = probabilityPlot.gumbelMaxMu();
  311. TreeMap<BigDecimal, BigDecimal> gumbelMap = new TreeMap<>();
  312. BigDecimal wsMax = BigDecimal.ZERO;
  313. for (WindTowerCalculationData w : windTowerCalculationDataList) {
  314. //最大风速值
  315. BigDecimal wsValue = w.getValue();
  316. //P(X)= exp {—exp[ -(X- α)/β]} 计算出在这个时间段的风速重现概率
  317. wsMax = BigDecimal.valueOf(Math.exp(-(Math.exp(-(w.getValue().doubleValue() - u) / v)))).setScale(2, RoundingMode.HALF_UP);
  318. //加入时间标识
  319. gumbelMap.put(wsValue, wsMax);
  320. }
  321. ArrayList<Object> list1 = new ArrayList<>();
  322. for (Map.Entry<BigDecimal, BigDecimal> g : gumbelMap.entrySet()) {
  323. HashMap<Object, Object> map = new HashMap<>();
  324. //风速
  325. map.put("wsMax", g.getKey());
  326. //概率
  327. map.put("gum", g.getValue());
  328. list1.add(map);
  329. }
  330. HashMap<String, Object> heightGumbelMap = new HashMap<>();
  331. heightGumbelMap.put(h, list1);
  332. //加入层高标识
  333. for (Map.Entry<String, Object> h1 : heightGumbelMap.entrySet()) {
  334. HashMap<Object, Object> map = new HashMap<>();
  335. map.put("height", h1.getKey());
  336. map.put("arr", h1.getValue());
  337. gumbelList.add(map);
  338. }
  339. }
  340. }
  341. return gumbelList;
  342. }
  343. /**
  344. * 湍流统计曲线图
  345. *
  346. * @param height 层高
  347. * @param eqId 设备编号
  348. * @return List<Object>
  349. */
  350. public List<Object> getTurbulence(Long startTime, Long endTime, String height, String eqId) {
  351. //最后返回的
  352. ArrayList<Object> onlyData = new ArrayList<>();
  353. //装所有风速数据
  354. ArrayList<Object> arrList = new ArrayList<>();
  355. //装平均值
  356. ArrayList<Object> list1 = new ArrayList<>();
  357. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  358. if (height == null || height.equals("")) {
  359. for (WindTowerInfo windTowerInfo : windTowerInfos) {
  360. height = windTowerInfo.getHeights();
  361. }
  362. }
  363. List<String> heightSort = new ArrayList<>();
  364. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
  365. String[] heightAll = height.split(",");
  366. for (String s : heightAll) {
  367. heightSort.add(s);
  368. }
  369. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getAttributeFunction, "turbulenceMonth").list();
  370. // 根据开始时间、结束时间、设备id查询统计表
  371. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  372. // 根据开始时间、结束时间分割的月份
  373. List<Long> timeList = DateTimeUtil.getIntervalTimeByMonth(new Date(startTime), new Date(endTime));
  374. for (String h : heightSort) {
  375. String turMonthFieldName = h + "turbulenceMonth";
  376. //存放数据
  377. // 获取EbId
  378. List<EquipmentAttribute> turDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(turMonthFieldName)).collect(Collectors.toList());
  379. if (!turDayFieldNameList.isEmpty()) {
  380. String turDayEbId = turDayFieldNameList.get(0).getId();
  381. //平均风速集合
  382. List<WindTowerCalculationData> turDayList = new ArrayList<>();
  383. // 根据属性id过滤统计表
  384. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(turDayEbId)).collect(Collectors.toList());
  385. ArrayList<Object> list = new ArrayList<>();
  386. BigDecimal turAve = BigDecimal.ZERO; // 平均湍流
  387. for (Long time : timeList) {
  388. turDayList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(time)) == 0).collect(Collectors.toList());
  389. BigDecimal value = BigDecimal.ZERO;
  390. if (!turDayList.isEmpty()) {
  391. value = turDayList.get(0).getValue();
  392. }
  393. HashMap<Object, Object> map = new HashMap<>();
  394. String format = sdf.format(time);
  395. map.put("tur", value.setScale(2, RoundingMode.HALF_UP));
  396. map.put("time", format);
  397. list.add(map);
  398. }
  399. // 曲线list
  400. Map<String, Object> finalMap = new HashMap<>();
  401. finalMap.put("height", h);
  402. finalMap.put("arr", list);
  403. arrList.add(finalMap);
  404. // 湍流数值集合
  405. List<BigDecimal> turList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  406. if (!turList.isEmpty()) {
  407. turAve = turList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(turList.size()), 2, RoundingMode.HALF_UP);
  408. }
  409. }
  410. }
  411. onlyData.add(arrList);
  412. onlyData.add(list1);
  413. return onlyData;
  414. }
  415. /**
  416. * 年资源统计(空气密度)
  417. *
  418. * @param startTime 开始时间
  419. * @param endTime 结束时间
  420. * @param eqId 设备编号
  421. * @return List<Object>
  422. */
  423. public List<Object> getDensityYear(Long startTime, Long endTime, String eqId) {
  424. String fieldName = "airDensityMonth";
  425. List<EquipmentAttribute> densityTypeList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, fieldName).list();
  426. String densityId = densityTypeList.get(0).getId();
  427. DateTime startTimeYear = DateUtil.beginOfYear(new Date(startTime));
  428. DateTime endTimeYear = DateUtil.endOfYear(new Date(endTime));
  429. List<WindTowerCalculationData> byBetweenTimeAndEquipmentId = getByStartTimeBetweenAndEquipmentIdAndEbId(startTimeYear, endTimeYear, eqId, densityTypeList.get(0).getId());
  430. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
  431. ArrayList<Object> PDataList = new ArrayList<>();
  432. for (long i = startTimeYear.getTime(); i <= endTimeYear.getTime(); i = DateUtil.offsetMonth(new Date(i), 12).getTime()) {
  433. //开始时间
  434. Date startTimeOfCurrentMonth = DateUtil.beginOfYear(new Date(i));
  435. //结束时间
  436. Date endTimeOfCurrentMonth = DateUtil.offsetMonth(new Date(i), 12);
  437. List<WindTowerCalculationData> densityDataList = byBetweenTimeAndEquipmentId.stream().filter(w -> w.getTime().getTime() >= startTimeOfCurrentMonth.getTime() && w.getTime().getTime() <= endTimeOfCurrentMonth.getTime() &&
  438. w.getEbId().equals(densityId)).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  439. BigDecimal pSum = BigDecimal.ZERO;
  440. for (WindTowerCalculationData w : densityDataList) {
  441. pSum = pSum.add(w.getValue());
  442. }
  443. HashMap<Object, Object> PTMap = new HashMap<>();
  444. if (!densityDataList.isEmpty()) {
  445. PTMap.put(simpleDateFormat.format(new Date(i)), pSum.divide(BigDecimal.valueOf(densityDataList.size()), 2, RoundingMode.HALF_UP));
  446. }
  447. for (Map.Entry<Object, Object> pt : PTMap.entrySet()) {
  448. HashMap<String, Object> map = new HashMap<>();
  449. map.put("time", pt.getKey());
  450. map.put("p", pt.getValue());
  451. PDataList.add(map);
  452. }
  453. }
  454. return PDataList;
  455. }
  456. /**
  457. * 年风资源统计(风速+风功率密度)
  458. *
  459. * @param startTime 开始年份
  460. * @param endTime 结束年份
  461. * @param height 层高
  462. * @param eqId 设备编号
  463. * @return List<Object>
  464. */
  465. public List<Object> getWindResources(Long startTime, Long endTime, String height, String eqId) {
  466. ArrayList<Object> DataList = new ArrayList<>();
  467. ArrayList<Object> DataOneList = new ArrayList<>();
  468. ArrayList<Object> DataTWOList = new ArrayList<>();
  469. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  470. if (height == null || height.equals("")) {
  471. height = windTowerInfos.get(0).getHeights();
  472. }
  473. //获取查询的年份
  474. DateTime startTimeYear = DateUtil.beginOfYear(new Date(startTime));
  475. DateTime endTimeYear = DateUtil.endOfYear(new Date(endTime));
  476. String[] heightAll = height.split(",");
  477. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.lambdaQuery().likeLeft(EquipmentAttribute::getFieldName, "awsMonth").or().likeLeft(EquipmentAttribute::getFieldName, "awsMonth").list();
  478. List<EquipmentAttribute> equipmentAttributeList1 = equipmentAttributeService.lambdaQuery().likeLeft(EquipmentAttribute::getFieldName, "wpdMonth").or().likeLeft(EquipmentAttribute::getFieldName, "awsMonth").list();
  479. equipmentAttributeList.addAll(equipmentAttributeList1);
  480. // List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  481. List<WindTowerCalculationData> windTowerCalculationDataList = this.getByBetweenTimeAndEquipmentIdAndEbId(new Date(startTime), new Date(endTime), eqId, equipmentAttributeList);
  482. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
  483. //遍历层高
  484. for (String h : heightAll) {
  485. //设置 层高+fieldName(数据库字段 50awsMonth)
  486. String fieldNameWs = h + "awsMonth";
  487. String fieldNameWpd = h + "wpdMonth";
  488. List<EquipmentAttribute> allWsFiledNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(fieldNameWs)).collect(Collectors.toList());
  489. List<EquipmentAttribute> allWpdFiledNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(fieldNameWpd)).collect(Collectors.toList());
  490. //存放最后数据的map
  491. HashMap<Object, Object> map1 = new HashMap<>();
  492. HashMap<String, Object> HDMap = new HashMap<>();
  493. //年平均风速存放的list
  494. ArrayList<Object> list = new ArrayList<>();
  495. //年风功率密度存放的list
  496. ArrayList<Object> list1 = new ArrayList<>();
  497. for (long l = startTimeYear.getTime(); l <= endTimeYear.getTime(); l = DateUtil.offsetMonth(new Date(l), 12).getTime()) {
  498. //开始时间
  499. Date startTimeOfCurrentMonth = DateUtil.beginOfYear(new Date(l));
  500. //结束时间
  501. Date endTimeOfCurrentMonth = DateUtil.offsetMonth(new Date(l), 12);
  502. if (!allWsFiledNameList.isEmpty()) {
  503. String awsMonthEqId = allWsFiledNameList.get(0).getId();
  504. List<WindTowerCalculationData> allDataWsList = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(eqId) && w.getEbId().equals(awsMonthEqId) &&
  505. w.getTime().after(startTimeOfCurrentMonth) && w.getTime().before(endTimeOfCurrentMonth)).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  506. BigDecimal wsYearData = BigDecimal.ZERO;
  507. for (WindTowerCalculationData ws : allDataWsList) {
  508. wsYearData = wsYearData.add(ws.getValue());
  509. }
  510. HashMap<Object, Object> wsMap = new HashMap<>();
  511. if (!allDataWsList.isEmpty()) {
  512. wsMap.put(simpleDateFormat.format(new Date(l)), wsYearData.divide(BigDecimal.valueOf(allDataWsList.size()), 2, RoundingMode.HALF_UP));
  513. }
  514. //给时间和年平均数值添加标识
  515. for (Map.Entry<Object, Object> ws1 : wsMap.entrySet()) {
  516. HashMap<String, Object> map = new HashMap<>();
  517. map.put("time", ws1.getKey());
  518. map.put("ws", ws1.getValue());
  519. list.add(map);
  520. }
  521. HashMap<String, Object> heightDataMap = new HashMap<>();
  522. //放入层高
  523. heightDataMap.put(h, list);
  524. for (Map.Entry<String, Object> hd : heightDataMap.entrySet()) {
  525. map1 = new HashMap<>();
  526. map1.put("height", hd.getKey());
  527. map1.put("arr", hd.getValue());
  528. }
  529. }
  530. if (!allWpdFiledNameList.isEmpty()) {
  531. String wpdMonthEqId = allWpdFiledNameList.get(0).getId();
  532. List<WindTowerCalculationData> allDataWpdList = windTowerCalculationDataList.stream().filter(w -> w.getEquipmentId().equals(eqId) && w.getEbId().equals(wpdMonthEqId) &&
  533. w.getTime().after(startTimeOfCurrentMonth) && w.getTime().before(endTimeOfCurrentMonth)).sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  534. BigDecimal wpdYearData = BigDecimal.ZERO;
  535. for (WindTowerCalculationData wpd : allDataWpdList) {
  536. wpdYearData = wpdYearData.add(wpd.getValue());
  537. }
  538. HashMap<Object, Object> wpdMap = new HashMap<>();
  539. //添加时间
  540. if (!allDataWpdList.isEmpty()) {
  541. wpdMap.put(simpleDateFormat.format(new Date(l)), wpdYearData.divide(BigDecimal.valueOf(allDataWpdList.size()), 2, RoundingMode.HALF_UP));
  542. }
  543. for (Map.Entry<Object, Object> wpd1 : wpdMap.entrySet()) {
  544. HashMap<Object, Object> map = new HashMap<>();
  545. map.put("time", wpd1.getKey());
  546. map.put("wpd", wpd1.getValue());
  547. list1.add(map);
  548. }
  549. HashMap<String, Object> heightDataMap = new HashMap<>();
  550. heightDataMap.put(h, list1);
  551. for (Map.Entry<String, Object> hd : heightDataMap.entrySet()) {
  552. HDMap = new HashMap<>();
  553. HDMap.put("height", hd.getKey());
  554. HDMap.put("arr", hd.getValue());
  555. }
  556. }
  557. }
  558. if (!map1.entrySet().isEmpty()) {
  559. DataOneList.add(map1);
  560. }
  561. if (!HDMap.entrySet().isEmpty()) {
  562. DataTWOList.add(HDMap);
  563. }
  564. }
  565. DataList.add(DataOneList);
  566. DataList.add(DataTWOList);
  567. return DataList;
  568. }
  569. /**
  570. * 时间段平均风速曲线图
  571. *
  572. * @param startTime 开始时间
  573. * @param endTime 结束时间
  574. * @param height 测高
  575. * @param eqId 设备编号
  576. * @return List<Object>
  577. */
  578. public List<Object> getWindSpeed(Long startTime, Long endTime, String height, String eqId, String uid) {
  579. //最后返回的
  580. ArrayList<Object> onlyData = new ArrayList<>();
  581. //装所有风速数据
  582. ArrayList<Object> arrList = new ArrayList<>();
  583. BigDecimal minWs = BigDecimal.ZERO;
  584. BigDecimal maxWs = BigDecimal.ZERO;
  585. //装平均值
  586. ArrayList<Object> list1 = new ArrayList<>();
  587. ArrayList<Object> list2 = new ArrayList<>();
  588. ArrayList<Object> list3 = new ArrayList<>();
  589. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.lambdaQuery().like(EquipmentAttribute::getAttributeFunction, "ws").list();
  590. String[] heights = null;
  591. if (height == null || height.equals("")) {
  592. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  593. heights = windTowerInfos.get(0).getHeights().split(",");
  594. } else {
  595. heights = height.split(",");
  596. }
  597. List<String> heightList = Arrays.asList(heights);
  598. if (uid.equals("1")) {//月逐日
  599. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  600. // 根据时间升序
  601. windTowerCalculationDataList.sort(Comparator.comparing(WindTowerCalculationData::getTime));
  602. //遍历所有层高
  603. for (String h : heightList) {
  604. String awsDayFieldName = h + "awsDay";
  605. List<EquipmentAttribute> awsDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(awsDayFieldName)).collect(Collectors.toList());
  606. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  607. //存放数据
  608. if (!awsDayFieldNameList.isEmpty()) {
  609. String awsDayEbId = awsDayFieldNameList.get(0).getId();
  610. //平均风速集合
  611. List<WindTowerCalculationData> awsDayList = new ArrayList<>();
  612. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(awsDayEbId)).collect(Collectors.toList());
  613. BigDecimal awsAve = BigDecimal.ZERO;
  614. ArrayList<Object> list = new ArrayList<>();
  615. for (long i = startTime; i < endTime; i += 1000 * 60 * 60 * 24) {
  616. long finalI = i;
  617. awsDayList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(finalI)) == 0).collect(Collectors.toList());
  618. HashMap<Object, Object> map = new HashMap<>();
  619. String format = sdf.format(i);
  620. BigDecimal value = BigDecimal.ZERO;
  621. if (!awsDayList.isEmpty()) {
  622. value = awsDayList.get(0).getValue();
  623. }
  624. map.put("ws", value);
  625. map.put("time", format);
  626. list.add(map);
  627. }
  628. // 曲线
  629. HashMap<Object, Object> finalMap = new HashMap<>();
  630. finalMap.put("height", h);
  631. finalMap.put("arr", list);
  632. arrList.add(finalMap);
  633. //平均值
  634. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  635. if (!aveWsList.isEmpty()) {
  636. awsAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  637. }
  638. HashMap<Object, Object> finalAveMap = new HashMap<>();
  639. finalAveMap.put("height", h);
  640. finalAveMap.put("aws", awsAve);
  641. list1.add(finalAveMap);
  642. //最小值 最大值
  643. if (!filterList.isEmpty()) {
  644. minWs = filterList.stream().min(Comparator.comparing(WindTowerCalculationData::getValue)).get().getValue();
  645. maxWs = filterList.stream().max(Comparator.comparing(WindTowerCalculationData::getValue)).get().getValue();
  646. }
  647. HashMap<Object, Object> finalMinMap = new HashMap<>();
  648. finalMinMap.put("height2", h);
  649. finalMinMap.put("min", minWs);
  650. list2.add(finalMinMap);
  651. HashMap<Object, Object> finalMaxMap = new HashMap<>();
  652. finalMaxMap.put("height3", h);
  653. finalMaxMap.put("max", maxWs);
  654. list3.add(finalMaxMap);
  655. }
  656. }
  657. onlyData.add(arrList);
  658. onlyData.add(list1);
  659. onlyData.add(list2);
  660. onlyData.add(list3);
  661. }
  662. if (uid.equals("2")) {
  663. //设置年份用的
  664. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  665. //给前端用的日期格式
  666. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
  667. //获取查询的年份
  668. int toYear = Integer.parseInt(sdf.format(startTime));
  669. int toYear2 = Integer.parseInt(sdf.format(endTime));
  670. Calendar calendar = Calendar.getInstance();
  671. calendar.clear();
  672. calendar.set(Calendar.YEAR, toYear);
  673. //当前年的开始时间
  674. long startHour = calendar.getTimeInMillis();
  675. calendar.clear();
  676. calendar.set(Calendar.YEAR, toYear2);
  677. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  678. //当前年的结束时间
  679. endTime = endTime + 100l;
  680. // 根据开始时间、结束时间分割的月份
  681. List<Long> timeList = DateTimeUtil.getIntervalTimeByMonth(new Date(startHour), new Date(endTime));
  682. // 开始年和结束年相同 getIntervalTimeByMonth 最后一个月会重复两次
  683. if (toYear == toYear2) {
  684. timeList.remove(timeList.size() - 1);
  685. }
  686. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startHour), new Date(endTime), eqId);
  687. for (String h : heights) {
  688. String awsMonthFieldName = h + "awsMonth";
  689. //存放数据
  690. List<EquipmentAttribute> awsDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(awsMonthFieldName)).collect(Collectors.toList());
  691. if (!awsDayFieldNameList.isEmpty()) {
  692. String awsDayEbId = awsDayFieldNameList.get(0).getId();
  693. //平均风速集合
  694. List<WindTowerCalculationData> awsDayList = new ArrayList<>();
  695. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(awsDayEbId)).collect(Collectors.toList());
  696. BigDecimal awsAve = BigDecimal.ZERO;
  697. ArrayList<Object> list = new ArrayList<>();
  698. for (long time : timeList) {
  699. awsDayList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(time)) == 0).collect(Collectors.toList());
  700. HashMap<Object, Object> map = new HashMap<>();
  701. String format = sdf1.format(time);
  702. BigDecimal value = BigDecimal.ZERO;
  703. if (!awsDayList.isEmpty()) {
  704. value = awsDayList.get(0).getValue();
  705. }
  706. map.put("ws", value);
  707. map.put("time", format);
  708. list.add(map);
  709. }
  710. // 曲线
  711. HashMap<Object, Object> finalMap = new HashMap<>();
  712. finalMap.put("height", h);
  713. finalMap.put("arr", list);
  714. arrList.add(finalMap);
  715. //平均值
  716. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  717. if (!aveWsList.isEmpty()) {
  718. awsAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  719. }
  720. HashMap<Object, Object> finalAveMap = new HashMap<>();
  721. finalAveMap.put("height", h);
  722. finalAveMap.put("aws", awsAve);
  723. list1.add(finalAveMap);
  724. //最小值 最大值
  725. if (!filterList.isEmpty()) {
  726. minWs = filterList.stream().min(Comparator.comparing(WindTowerCalculationData::getValue)).get().getValue();
  727. maxWs = filterList.stream().max(Comparator.comparing(WindTowerCalculationData::getValue)).get().getValue();
  728. }
  729. HashMap<Object, Object> finalMinMap = new HashMap<>();
  730. finalMinMap.put("height2", h);
  731. finalMinMap.put("min", minWs);
  732. list2.add(finalMinMap);
  733. HashMap<Object, Object> finalMaxMap = new HashMap<>();
  734. finalMaxMap.put("height3", h);
  735. finalMaxMap.put("max", maxWs);
  736. list3.add(finalMaxMap);
  737. }
  738. }
  739. onlyData.add(arrList);
  740. onlyData.add(list1);
  741. onlyData.add(list2);
  742. onlyData.add(list3);
  743. }
  744. return onlyData;
  745. }
  746. /**
  747. * 时间段风功率密度曲线图(统计查询)
  748. *
  749. * @param startTime 开始时间
  750. * @param endTime 结束时间
  751. * @param height 测高
  752. * @param eqId 设备编号
  753. * @return List<Object>
  754. */
  755. public List<Object> getWpd(Long startTime, Long endTime, String height, String eqId, String uid) {
  756. //最后返回的
  757. ArrayList<Object> onlyData = new ArrayList<>();
  758. //装所有风功率密度数据
  759. ArrayList<Object> arrList = new ArrayList<>();
  760. //装平均值
  761. ArrayList<Object> list1 = new ArrayList<>();
  762. List<WindTowerInfo> windTowerInfos = windTowerInfoService.lambdaQuery().eq(WindTowerInfo::getEquipmentNo, eqId).list();
  763. if (height == null || height.equals("")) {
  764. height = windTowerInfos.get(0).getHeights();
  765. }
  766. String[] heightAll = height.split(",");
  767. List<String> heightSort = Arrays.asList(heightAll);
  768. //查询统计属性表
  769. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getAttributeFunction, "WindPowerDensity").list();
  770. //查询统计数据表
  771. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId);
  772. if (uid.equals("1")) {
  773. //遍历所有层高
  774. for (String h : heightSort) {
  775. String wpdDayFieldName = h + "wpdDay";
  776. List<EquipmentAttribute> wpdDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(wpdDayFieldName)).collect(Collectors.toList());
  777. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  778. //存放数据
  779. if (!wpdDayFieldNameList.isEmpty()) {
  780. String wpdDayEbId = wpdDayFieldNameList.get(0).getId();
  781. //平均风速集合
  782. List<WindTowerCalculationData> wpdDayList = new ArrayList<>();
  783. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wpdDayEbId)).collect(Collectors.toList());
  784. BigDecimal wpdAve = BigDecimal.ZERO;
  785. ArrayList<Object> list = new ArrayList<>();
  786. for (long i = startTime; i < endTime; i += 1000 * 60 * 60 * 24) {
  787. long finalI = i;
  788. wpdDayList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(finalI)) == 0).collect(Collectors.toList());
  789. HashMap<Object, Object> map = new HashMap<>();
  790. String format = sdf.format(i);
  791. BigDecimal value = BigDecimal.ZERO;
  792. if (!wpdDayList.isEmpty()) {
  793. value = wpdDayList.get(0).getValue();
  794. }
  795. map.put("wpd", value);
  796. map.put("time", format);
  797. list.add(map);
  798. }
  799. // 曲线
  800. HashMap<Object, Object> finalMap = new HashMap<>();
  801. finalMap.put("height", h);
  802. finalMap.put("arr", list);
  803. arrList.add(finalMap);
  804. //平均值
  805. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  806. if (!aveWsList.isEmpty()) {
  807. wpdAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  808. }
  809. HashMap<Object, Object> finalAveMap = new HashMap<>();
  810. finalAveMap.put("height", h);
  811. finalAveMap.put("wpdAve", wpdAve);
  812. list1.add(finalAveMap);
  813. }
  814. }
  815. onlyData.add(arrList);
  816. onlyData.add(list1);
  817. }
  818. if (uid.equals("2")) {
  819. //设置年份用的
  820. SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
  821. //给前端用的日期格式
  822. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
  823. //获取查询的年份
  824. int toYear = Integer.parseInt(sdf.format(startTime));
  825. int toYear2 = Integer.parseInt(sdf.format(endTime));
  826. Calendar calendar = Calendar.getInstance();
  827. calendar.clear();
  828. calendar.set(Calendar.YEAR, toYear);
  829. //当前年的开始时间
  830. long startHour = calendar.getTimeInMillis();
  831. calendar.clear();
  832. calendar.set(Calendar.YEAR, toYear2);
  833. calendar.roll(Calendar.DAY_OF_YEAR, -1);
  834. //当前年的结束时间
  835. endTime = endTime + 100L;
  836. // 根据开始时间、结束时间分割的月份
  837. List<Long> timeList = DateTimeUtil.getIntervalTimeByMonth(new Date(startHour), new Date(endTime));
  838. // 开始年和结束年相同 getIntervalTimeByMonth 最后一个月会重复两次
  839. if (toYear == toYear2) {
  840. timeList.remove(timeList.size() - 1);
  841. }
  842. windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startHour), new Date(endTime), eqId);
  843. for (String h : heightSort) {
  844. String wpdMonthFieldName = h + "wpdMonth";
  845. //存放数据
  846. List<EquipmentAttribute> wpdDayFieldNameList = equipmentAttributeList.stream().filter(w -> w.getFieldName().equals(wpdMonthFieldName)).collect(Collectors.toList());
  847. if (!wpdDayFieldNameList.isEmpty()) {
  848. //获取对应的ebId
  849. String wpdDayEbId = wpdDayFieldNameList.get(0).getId();
  850. //平均风速集合
  851. List<WindTowerCalculationData> wpdMonthList = new ArrayList<>();
  852. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(wpdDayEbId)).collect(Collectors.toList());
  853. BigDecimal wpdAve = BigDecimal.ZERO;
  854. ArrayList<Object> list = new ArrayList<>();
  855. for (long time : timeList) {
  856. wpdMonthList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(time)) == 0).collect(Collectors.toList());
  857. HashMap<Object, Object> map = new HashMap<>();
  858. String format = sdf1.format(time);
  859. BigDecimal value = BigDecimal.ZERO;
  860. if (!wpdMonthList.isEmpty()) {
  861. value = wpdMonthList.get(0).getValue();
  862. }
  863. map.put("wpd", value);
  864. map.put("time", format);
  865. list.add(map);
  866. }
  867. // 曲线
  868. HashMap<Object, Object> finalMap = new HashMap<>();
  869. finalMap.put("height", h);
  870. finalMap.put("arr", list);
  871. arrList.add(finalMap);
  872. //平均值
  873. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  874. if (!aveWsList.isEmpty()) {
  875. wpdAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  876. }
  877. HashMap<Object, Object> finalAveMap = new HashMap<>();
  878. finalAveMap.put("height", h);
  879. finalAveMap.put("wpdAve", wpdAve);
  880. list1.add(finalAveMap);
  881. }
  882. }
  883. onlyData.add(arrList);
  884. onlyData.add(list1);
  885. }
  886. return onlyData;
  887. }
  888. /**
  889. * 时间段(年逐月)风切变曲线图(统计查询)
  890. *
  891. * @param height 测高
  892. * @param eqId 设备编号
  893. * @return List<Object>
  894. */
  895. public List<Object> getShear(Long startTime, Long endTime, String height, String eqId) {
  896. //最后返回的
  897. ArrayList<Object> onlyData = new ArrayList<>();
  898. //装所有风功率密度数据
  899. ArrayList<Object> arrList = new ArrayList<>();
  900. //装平均值
  901. ArrayList<Object> list1 = new ArrayList<>();
  902. //给前端用的日期格式
  903. SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM");
  904. //获取统计属性表
  905. List<EquipmentAttribute> shearDayFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getFieldName, "windShearMonth").list();
  906. //获取统计数据表
  907. List<WindTowerCalculationData> windTowerCalculationDataList = getByBetweenTimeAndEquipmentId(new Date(startTime), new Date(endTime), eqId).stream().sorted(Comparator.comparing(WindTowerCalculationData::getTime)).collect(Collectors.toList());
  908. ;
  909. // 根据开始时间、结束时间分割的月份
  910. List<Long> timeList = DateTimeUtil.getIntervalTimeByMonth(new Date(startTime), new Date(endTime));
  911. //存放数据
  912. if (!shearDayFieldNameList.isEmpty()) {
  913. String shearDayEbId = shearDayFieldNameList.get(0).getId();
  914. //风切变集合
  915. List<WindTowerCalculationData> shearMonthList = new ArrayList<>();
  916. List<WindTowerCalculationData> filterList = windTowerCalculationDataList.stream().filter(w -> w.getEbId().equals(shearDayEbId)).collect(Collectors.toList());
  917. BigDecimal shearAve = BigDecimal.ZERO;
  918. ArrayList<Object> list = new ArrayList<>();
  919. for (long time : timeList) {
  920. shearMonthList = filterList.stream().filter(w -> w.getTime().compareTo(new Date(time)) == 0).collect(Collectors.toList());
  921. HashMap<Object, Object> map = new HashMap<>();
  922. String format = sdf1.format(time);
  923. BigDecimal value = BigDecimal.ZERO;
  924. if (!shearMonthList.isEmpty()) {
  925. value = shearMonthList.get(0).getValue();
  926. }
  927. map.put("shear", value);
  928. map.put("time", format);
  929. list.add(map);
  930. }
  931. // 曲线
  932. HashMap<Object, Object> finalMap = new HashMap<>();
  933. finalMap.put("height", "综合风切变");
  934. finalMap.put("arr", list);
  935. arrList.add(finalMap);
  936. //平均值
  937. List<BigDecimal> aveWsList = filterList.stream().map(WindTowerCalculationData::getValue).collect(Collectors.toList());
  938. if (!aveWsList.isEmpty()) {
  939. shearAve = aveWsList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(aveWsList.size()), 2, RoundingMode.HALF_UP);
  940. }
  941. HashMap<Object, Object> finalAveMap = new HashMap<>();
  942. finalAveMap.put("height", "综合风切变");
  943. finalAveMap.put("shearAve", shearAve);
  944. list1.add(finalAveMap);
  945. }
  946. onlyData.add(arrList);
  947. onlyData.add(list1);
  948. return onlyData;
  949. }
  950. /**
  951. * 查询当前月的24个小时对应的风切变指数
  952. * 每月1号的0-1点之间查询上个月的
  953. *
  954. * @return Map<String, WindTowerCalculationData>
  955. */
  956. private Map<String, WindTowerCalculationData> queryHistoryWindTowerCalculationDatas(List<WindTowerCalculationData> windTowerCalculationDataList) {
  957. Map<String, WindTowerCalculationData> windTowerCalculationDataMap = new HashMap<>();
  958. //查询风切变 月平均数据 根据时间,层高,设备id 并根据时间升序排列
  959. windTowerCalculationDataList.forEach(windTowerCalculationData -> windTowerCalculationDataMap.put(windTowerCalculationData.getTime() + windTowerCalculationData.getEquipmentId() + windTowerCalculationData.getEbId(), windTowerCalculationData));
  960. return windTowerCalculationDataMap;
  961. }
  962. /**
  963. * 遍历查询到的风速数据,计算每隔10分钟的风切变指数
  964. *
  965. * @param map map
  966. * @return Map<String, List < BigDecimal>>
  967. */
  968. private Map<String, List<BigDecimal>> traverseWindDataListCalcuShear(Map<String, BigDecimal> map, Integer heightMin) {
  969. Map<String, List<BigDecimal>> windTowerShearMap = new HashMap<>();
  970. map.forEach((key, value) -> {
  971. String[] keys = key.split("-");//0:层高 1:整10分的时间点 2:设备ID 3:日
  972. //10米层高不计算,没有更低的
  973. if (!String.valueOf(heightMin).equals(keys[0]) && null != value) {
  974. calculateShearByHeight10(keys, value, windTowerShearMap, map, heightMin);
  975. }
  976. });
  977. return windTowerShearMap;
  978. }
  979. /**
  980. * 查询数据类型表,获取所有风切变指数参数
  981. *
  982. * @return Map<String, String>
  983. */
  984. private Map<String, String> queryEquipmentAttributeMap() {
  985. List<EquipmentAttribute> shearFieldNameList = equipmentAttributeService.lambdaQuery().eq(EquipmentAttribute::getAttributeFunction, shearFunction).list();
  986. return shearFieldNameList.stream().collect(Collectors.toMap(EquipmentAttribute::getFieldName, EquipmentAttribute::getId));
  987. }
  988. /**
  989. * 查询当前月份的风速数据,如果是1号0点-1点执行则查询上一个月的数据
  990. *
  991. * @return Map<String, BigDecimal>
  992. */
  993. private Map<String, BigDecimal> queryWindForShear(Date startTimeOfCurrentDay, Date endTimeOfCurrentDay, String equipmentId, List<ProphaseAnemometryData> prophaseAnemometryData, String[] heights) {
  994. Map<String, BigDecimal> windTowerStatusDataResult = new HashMap<>();
  995. // 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());
  996. List<ProphaseAnemometryData> collect = prophaseAnemometryData.stream().filter(p -> p.getTs().getTime() >= startTimeOfCurrentDay.getTime() && p.getTs().getTime() <= endTimeOfCurrentDay.getTime()).collect(Collectors.toList());
  997. //只取上一个小时的数据
  998. int curentHour = startTimeOfCurrentDay.getHours();
  999. //构造当前小时的风速map 以层高和分钟,日为key,风速为value
  1000. for (ProphaseAnemometryData map : collect) {
  1001. for (String height : heights) {
  1002. Date time = new Date(map.getTs().getTime());
  1003. if (curentHour == time.getHours() && map.getLayerHeight().equals(height)) {
  1004. //获取 毫秒数
  1005. Integer minutes = time.getMinutes();
  1006. String keyEndStr = minutes + "-" + equipmentId + "-" + DateTimeUtil.getDay(time.getTime());
  1007. windTowerStatusDataResult.put(height + "-" + keyEndStr, CalculationUtil.getBigDecimal(map.getWsAve()));
  1008. }
  1009. }
  1010. }
  1011. return windTowerStatusDataResult;
  1012. }
  1013. /**
  1014. * 查询当前月份的风速数据,如果是1号0点-1点执行则查询上一个月的数据
  1015. *
  1016. * @return Map<String, BigDecimal>
  1017. */
  1018. private Map<String, BigDecimal> queryWindForShear(Date startTimeOfCurrentDay, Date endTimeOfCurrentDay, String equipmentId, List<Map<String, Object>> mapList) {
  1019. Map<String, BigDecimal> windTowerStatusDataResult = new HashMap<>();
  1020. 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());
  1021. //只取上一个小时的数据
  1022. int curentHour = startTimeOfCurrentDay.getHours();
  1023. //构造当前小时的风速map 以层高和分钟,日为key,风速为value
  1024. for (Map<String, Object> map : collect) {
  1025. Date time = new Date(Long.parseLong(map.get("time").toString()));
  1026. if (curentHour == time.getHours()) {
  1027. //获取 毫秒数
  1028. Integer minutes = time.getMinutes();
  1029. String keyEndStr = minutes + "-" + equipmentId + "-" + DateTimeUtil.getDay(time.getTime());
  1030. if (null != map.get("abnormal_data")) {
  1031. judgeWsDataIsError(windTowerStatusDataResult, map, keyEndStr);
  1032. } else {
  1033. windTowerStatusDataResult.put("10-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave10")));
  1034. windTowerStatusDataResult.put("30-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave30")));
  1035. windTowerStatusDataResult.put("50-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave50")));
  1036. windTowerStatusDataResult.put("70-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave70")));
  1037. windTowerStatusDataResult.put("80-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave80")));
  1038. windTowerStatusDataResult.put("90-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave90")));
  1039. windTowerStatusDataResult.put("100-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave100")));
  1040. windTowerStatusDataResult.put("110-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave110")));
  1041. windTowerStatusDataResult.put("120-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave120")));
  1042. windTowerStatusDataResult.put("120A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave120A")));
  1043. windTowerStatusDataResult.put("140-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave140")));
  1044. windTowerStatusDataResult.put("140A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave140A")));
  1045. windTowerStatusDataResult.put("150-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave150")));
  1046. windTowerStatusDataResult.put("150A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave150A")));
  1047. windTowerStatusDataResult.put("160-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave160")));
  1048. windTowerStatusDataResult.put("160A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave160A")));
  1049. }
  1050. }
  1051. }
  1052. return windTowerStatusDataResult;
  1053. }
  1054. /**
  1055. * 异常风速值不进行计算,忽略处理
  1056. *
  1057. * @param windTowerStatusDataResult windTowerStatusDataResult
  1058. * @param map map
  1059. * @param keyEndStr keyEndStr
  1060. */
  1061. private void judgeWsDataIsError(Map<String, BigDecimal> windTowerStatusDataResult, Map<String, Object> map, String keyEndStr) {
  1062. String abnormalType = map.get("abnormal_type").toString();
  1063. if (!abnormalType.contains("Ave10")) {
  1064. windTowerStatusDataResult.put("10-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave10")));
  1065. }
  1066. if (!abnormalType.contains("Ave30")) {
  1067. windTowerStatusDataResult.put("30-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave30")));
  1068. }
  1069. if (!abnormalType.contains("Ave50")) {
  1070. windTowerStatusDataResult.put("50-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave50")));
  1071. }
  1072. if (!abnormalType.contains("Ave70")) {
  1073. windTowerStatusDataResult.put("70-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave70")));
  1074. }
  1075. if (!abnormalType.contains("Ave80")) {
  1076. windTowerStatusDataResult.put("80-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave80")));
  1077. }
  1078. if (!abnormalType.contains("Ave90")) {
  1079. windTowerStatusDataResult.put("90-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave90")));
  1080. }
  1081. if (!abnormalType.contains("Ave100")) {
  1082. windTowerStatusDataResult.put("100-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave100")));
  1083. }
  1084. if (!abnormalType.contains("Ave110")) {
  1085. windTowerStatusDataResult.put("110-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave110")));
  1086. }
  1087. if (!abnormalType.contains("Ave120")) {
  1088. windTowerStatusDataResult.put("120-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave120")));
  1089. }
  1090. if (!abnormalType.contains("Ave120A")) {
  1091. windTowerStatusDataResult.put("120A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave120A")));
  1092. }
  1093. if (!abnormalType.contains("Ave140")) {
  1094. windTowerStatusDataResult.put("140-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave140")));
  1095. }
  1096. if (!abnormalType.contains("Ave150")) {
  1097. windTowerStatusDataResult.put("150-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave150")));
  1098. }
  1099. if (!abnormalType.contains("Ave160")) {
  1100. windTowerStatusDataResult.put("160-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave160")));
  1101. }
  1102. if (!abnormalType.contains("Ave140A")) {
  1103. windTowerStatusDataResult.put("140A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave140A")));
  1104. }
  1105. if (!abnormalType.contains("Ave150A")) {
  1106. windTowerStatusDataResult.put("150A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave150A")));
  1107. }
  1108. if (!abnormalType.contains("Ave160A")) {
  1109. windTowerStatusDataResult.put("160A-" + keyEndStr, CalculationUtil.getBigDecimal(map.get("ws_ave160A")));
  1110. }
  1111. }
  1112. /**
  1113. * 以10米风速为基准 计算层高风切变指数
  1114. *
  1115. * @param keys keys
  1116. * @param ws ws
  1117. * @param windTowerShearMap 各层高风切结果集
  1118. * @param map
  1119. */
  1120. private void calculateShearByHeight10(String[] keys, BigDecimal ws, Map<String, List<BigDecimal>> windTowerShearMap, Map<String, BigDecimal> map, Integer heightMin) {
  1121. String height = keys[0];
  1122. String MINUTE = keys[1];
  1123. String equipmentId = keys[2];
  1124. String day = keys[3];
  1125. String keyEndStr = MINUTE + "-" + equipmentId + "-" + day;
  1126. String key = height + "-00-" + equipmentId;
  1127. //10米风速
  1128. BigDecimal wsMin = Convert.toBigDecimal(map.get(heightMin + "-" + keyEndStr));
  1129. //计算各风速风切变
  1130. BigDecimal shear = BigDecimal.ZERO;
  1131. if (wsMin != null) {
  1132. double z = new BigDecimal(getNumberFromString(height)).divide(new BigDecimal(heightMin), 4, RoundingMode.HALF_UP).doubleValue();
  1133. double z1 = Math.log10(z);
  1134. shear = Convert.toBigDecimal(Math.log10(Convert.toDouble(ws.divide(wsMin, 8, RoundingMode.HALF_UP))))
  1135. .divide(BigDecimal.valueOf(z1), 8, RoundingMode.HALF_UP);
  1136. }
  1137. //将计算的风切变结果放入结果集合中
  1138. if (null != windTowerShearMap.get(key)) {
  1139. List<BigDecimal> list = windTowerShearMap.get(key);
  1140. list.add(shear);
  1141. } else {
  1142. List<BigDecimal> list = new ArrayList<>();
  1143. list.add(shear);
  1144. windTowerShearMap.put(key, list);
  1145. }
  1146. }
  1147. /**
  1148. * 根据时间范围 设备id 属性id删除
  1149. *
  1150. * @param equipmentId 设备id
  1151. * @param ebId 属性id
  1152. * @return List<WindTowerCalculationData>
  1153. */
  1154. public List<WindTowerCalculationData> findByEquipmentIdAndEbId(String equipmentId, String ebId) {
  1155. Map<String, Object> map = new HashMap<>();
  1156. map.put("equipment_id", equipmentId);
  1157. RequestDataHelper.setRequestData(map);
  1158. QueryWrapper<WindTowerCalculationData> wrapper = new QueryWrapper();
  1159. if (equipmentId != null && !equipmentId.equals("")) {
  1160. wrapper.eq("equipment_id", equipmentId);
  1161. }
  1162. if (ebId != null && !ebId.equals("")) {
  1163. wrapper.eq("eb_id", ebId);
  1164. }
  1165. return baseMapper.selectList(wrapper);
  1166. }
  1167. /**
  1168. * 根据时间范围和设备id查询数据
  1169. *
  1170. * @param equipmentId 设备属性id
  1171. * @return List<WindTowerCalculationData>
  1172. */
  1173. public List<WindTowerCalculationData> getByBetweenTimeAndEquipmentId(Date startTime, Date endTime, String equipmentId) {
  1174. Map<String, Object> map = new HashMap<>();
  1175. map.put("equipment_id", equipmentId);
  1176. RequestDataHelper.setRequestData(map);
  1177. QueryWrapper<WindTowerCalculationData> wrapper = new QueryWrapper();
  1178. if (startTime != null && endTime != null) {
  1179. wrapper.between("time", startTime, endTime);
  1180. }
  1181. if (equipmentId != null && !equipmentId.equals("")) {
  1182. wrapper.eq("equipment_id", equipmentId);
  1183. }
  1184. return baseMapper.selectList(wrapper);
  1185. }
  1186. //根据ebId集合、时间、设备编号查询
  1187. public List<WindTowerCalculationData> getByBetweenTimeAndEquipmentIdAndEbId(Date startTime, Date endTime, String equipmentId, List<EquipmentAttribute> equipmentAttributeList) {
  1188. LambdaQueryWrapper<WindTowerCalculationData> wrapper = Wrappers.lambdaQuery();
  1189. Map<String, Object> map = new HashMap<>();
  1190. map.put("equipment_id", equipmentId);
  1191. RequestDataHelper.setRequestData(map);
  1192. wrapper.eq(WindTowerCalculationData::getEquipmentId, equipmentId);
  1193. wrapper.between(WindTowerCalculationData::getTime, startTime, endTime);
  1194. for (EquipmentAttribute equipmentAttribute : equipmentAttributeList) {
  1195. wrapper.eq(WindTowerCalculationData::getEbId, equipmentAttribute.getId()).or();
  1196. }
  1197. return baseMapper.selectList(wrapper);
  1198. }
  1199. public void saveByEquipmentId(WindTowerCalculationData windTowerCalculationData, String equipmentId) {
  1200. Map<String, Object> map = new HashMap<>();
  1201. map.put("equipment_id", equipmentId);
  1202. RequestDataHelper.setRequestData(map);
  1203. this.save(windTowerCalculationData);
  1204. }
  1205. public void saveBatchByEquipmentId(List<WindTowerCalculationData> windTowerCalculationDataList, String equipmentId) {
  1206. Map<String, Object> map = new HashMap<>();
  1207. map.put("equipment_id", equipmentId);
  1208. RequestDataHelper.setRequestData(map);
  1209. this.saveBatch(windTowerCalculationDataList);
  1210. }
  1211. /**
  1212. * 根据时间范围 设备id 属性id删除
  1213. *
  1214. * @param startTime 开始时间
  1215. * @param endTime 结束时间
  1216. * @param equipmentId 设备id
  1217. * @param ebId 属性id
  1218. */
  1219. public void removeByStartTimeBetweenAndEquipmentIdAndEbId(Date startTime, Date endTime, String equipmentId, String ebId) {
  1220. Map<String, Object> map = new HashMap<>();
  1221. map.put("equipment_id", equipmentId);
  1222. RequestDataHelper.setRequestData(map);
  1223. QueryWrapper<WindTowerCalculationData> wrapper = new QueryWrapper();
  1224. if (startTime != null && endTime != null) {
  1225. wrapper.between("time", startTime, endTime);
  1226. }
  1227. if (equipmentId != null && !equipmentId.equals("")) {
  1228. wrapper.eq("equipment_id", equipmentId);
  1229. }
  1230. if (ebId != null && !ebId.equals("")) {
  1231. wrapper.eq("eb_id", ebId);
  1232. }
  1233. remove(wrapper);
  1234. }
  1235. /**
  1236. * 根据时间范围 设备id 属性id查询
  1237. *
  1238. * @param startTime 开始时间
  1239. * @param endTime 结束时间
  1240. * @param equipmentId 设备id
  1241. * @param ebId 属性id
  1242. * @return List<WindTowerCalculationData>
  1243. */
  1244. public List<WindTowerCalculationData> getByStartTimeBetweenAndEquipmentIdAndEbId(Date startTime, Date endTime, String equipmentId, String ebId) {
  1245. Map<String, Object> map = new HashMap<>();
  1246. map.put("equipment_id", equipmentId);
  1247. RequestDataHelper.setRequestData(map);
  1248. QueryWrapper<WindTowerCalculationData> wrapper = new QueryWrapper();
  1249. if (startTime != null && endTime != null) {
  1250. wrapper.between("time", startTime, endTime);
  1251. }
  1252. if (equipmentId != null && !equipmentId.equals("")) {
  1253. wrapper.eq("equipment_id", equipmentId);
  1254. }
  1255. if (ebId != null && !ebId.equals("")) {
  1256. wrapper.eq("eb_id", ebId);
  1257. }
  1258. return baseMapper.selectList(wrapper);
  1259. }
  1260. /**
  1261. * 从 String 中提取数字
  1262. *
  1263. * @param string
  1264. * @return
  1265. */
  1266. public static String getNumberFromString(String string) {
  1267. String str = string;
  1268. str = str.trim();
  1269. StringBuffer str2 = new StringBuffer();
  1270. if (str != null && !"".equals(str)) {
  1271. for (int i = 0; i < str.length(); i++) {
  1272. if (str.charAt(i) >= 48 && str.charAt(i) <= 57) {
  1273. String s = String.valueOf(str.charAt(i));
  1274. str2.append(s);
  1275. }
  1276. }
  1277. }
  1278. return str2.toString();
  1279. }
  1280. /**
  1281. * 根据设备编号获取该设备的最后一条统计数据
  1282. *
  1283. * @param equipmentId 设备编号
  1284. * @return WindTowerCalculationData
  1285. */
  1286. public WindTowerCalculationData getLastDataCalculation(String equipmentId) {
  1287. return baseMapper.getLastData(equipmentId);
  1288. }
  1289. }