AirDensityJob.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package com.jiayue.biz.job;
  2. import cn.hutool.core.date.DateTime;
  3. import cn.hutool.db.Entity;
  4. import cn.hutool.json.JSONObject;
  5. import cn.hutool.json.JSONUtil;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.jiayue.biz.domain.*;
  8. import com.jiayue.biz.mapper.ProphaseAnemometryDataMapper;
  9. import com.jiayue.biz.service.*;
  10. import com.jiayue.biz.service.impl.*;
  11. import com.jiayue.biz.util.CalculationUtil;
  12. import com.jiayue.biz.util.DateTimeUtil;
  13. import com.jiayue.common.utils.DateUtil;
  14. import io.undertow.util.DateUtils;
  15. import lombok.AllArgsConstructor;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.data.mongodb.core.MongoTemplate;
  19. import org.springframework.scheduling.annotation.EnableScheduling;
  20. import org.springframework.scheduling.annotation.Scheduled;
  21. import org.springframework.stereotype.Service;
  22. import java.math.BigDecimal;
  23. import java.math.RoundingMode;
  24. import java.sql.Time;
  25. import java.sql.Timestamp;
  26. import java.util.*;
  27. import java.util.stream.Collectors;
  28. @Slf4j
  29. @Service
  30. @EnableScheduling
  31. @AllArgsConstructor
  32. public class AirDensityJob {
  33. private final WindTowerCalculationDataServiceImpl windTowerCalculationDataService;
  34. private final WindTowerInfoServiceImpl windTowerInfoService;
  35. private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataService;
  36. private final EquipmentAttributeService equipmentAttributeService;
  37. private final StatisticsSituationServiceImpl statisticsSituationService;
  38. private final WindTowerDataParentTableService windTowerDataParentTableService;
  39. private final ProphaseAnemometryDataService prophaseAnemometryDataService;
  40. private final ProphaseWeatherDataService prophaseWeatherDataService;
  41. private final StationInfoService stationInfoService;
  42. private final MongoTemplate mongoTemplate;
  43. @Scheduled(cron = "0 0 15 * * ?")
  44. public void AirDensityCalculation() {
  45. List<WindTowerInfo> windTowerInfoList = windTowerInfoService.list();
  46. // 统计概述信息
  47. List<StatisticsSituation> statisticsSituations = statisticsSituationService.list();
  48. // 设备属性信息
  49. List<EquipmentAttribute> equipmentAttributeList = equipmentAttributeService.list();
  50. //前7天
  51. Date startDate = DateTimeUtil.getDayStartTime(new Date().getTime() - 60 * 60 * 24 * 1000 * 8);
  52. //前一天23点59分
  53. Date endDate = DateTimeUtil.getDayLastTime(DateUtil.yesterday().getTime());
  54. //传入时间的月初
  55. Date startMonthDate = DateTimeUtil.beginOfMonth(startDate);
  56. //传入时间的月末
  57. Date endMonthDate = DateTimeUtil.endOfMonth(endDate);
  58. for (WindTowerInfo windTowerInfo : windTowerInfoList) {
  59. Date sevenDate = startDate;
  60. Date startTime = startMonthDate;
  61. WindTowerCalculationData lastData = windTowerCalculationDataService.getLastDataCalculation(windTowerInfo.getEquipmentNo());
  62. List<Entity> lastRealData = prophaseWeatherDataService.getLastData(windTowerInfo.getEquipmentNo());
  63. if (lastData != null && lastRealData != null){
  64. Timestamp timestamp = (Timestamp) lastRealData.get(0).get("last (ts)");
  65. long lastTime = DateUtil.endOfDay(lastData.getTime()).getTime();
  66. long realTime = DateUtil.endOfDay(new Date(timestamp.getTime())).getTime();
  67. if(lastTime == realTime){
  68. continue;
  69. }
  70. if (realTime - lastTime >= 60 * 60 * 24 * 1000 * 8) {
  71. sevenDate = new Date(lastTime);
  72. }
  73. }
  74. if(sevenDate.getTime() < startMonthDate.getTime()){
  75. startTime = sevenDate;
  76. }
  77. //风数据查询
  78. List<ProphaseAnemometryData> prophaseAnemometryDataList = prophaseAnemometryDataService.selectAll(windTowerInfo.getEquipmentNo(), new Timestamp(startTime.getTime()), new Timestamp(endDate.getTime()));
  79. //环境数据查询
  80. List<ProphaseWeatherData> prophaseWeatherDataList = prophaseWeatherDataService.selectPublicData(windTowerInfo.getEquipmentNo(), new Timestamp(startTime.getTime()), new Timestamp(endDate.getTime()));
  81. //统计数据
  82. List<WindTowerCalculationData> windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startTime, endDate, windTowerInfo.getEquipmentNo());
  83. //小时平均风速风功率密度
  84. ArrayList<WindTowerCalculationData> wsAndWpdList = windTowerCalculationDataService.calculateWindPowerDensity(sevenDate.getTime(), endDate.getTime(), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
  85. ArrayList<WindTowerCalculationData> dataList = new ArrayList<>(wsAndWpdList);
  86. //每小时风切变指数
  87. ArrayList<WindTowerCalculationData> windShearList = windTowerCalculationDataService.calculateWindPowerShear(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, windTowerCalculationDataList);
  88. dataList.addAll(windShearList);
  89. //日平均温度
  90. ArrayList<WindTowerCalculationData> tList = windTowerCalculationDataService.tDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList);
  91. dataList.addAll(tList);
  92. //日平均气压
  93. ArrayList<WindTowerCalculationData> paList = windTowerCalculationDataService.paDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList);
  94. dataList.addAll(paList);
  95. //发电量与满发小时数
  96. ArrayList<WindTowerCalculationData> calculateBattery = windTowerCalculationDataService.calculateBattery(sevenDate.getTime(), endDate.getTime(), windTowerInfo, prophaseAnemometryDataList, equipmentAttributeList, windTowerCalculationDataList);
  97. dataList.addAll(calculateBattery);
  98. //日平均空气密度
  99. ArrayList<WindTowerCalculationData> airList = windTowerCalculationDataService.airDensityDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList);
  100. dataList.addAll(airList);
  101. //日平均风速标差
  102. ArrayList<WindTowerCalculationData> staDay = windTowerCalculationDataService.calculateStaDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
  103. dataList.addAll(staDay);
  104. //日平均风速
  105. ArrayList<WindTowerCalculationData> wsDayList = windTowerCalculationDataService.wsDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  106. dataList.addAll(wsDayList);
  107. //日平均湍流
  108. ArrayList<WindTowerCalculationData> turList = windTowerCalculationDataService.turbulenceDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList);
  109. dataList.addAll(turList);
  110. //日平均风切变
  111. ArrayList<WindTowerCalculationData> windShearDay = windTowerCalculationDataService.shearDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  112. dataList.addAll(windShearDay);
  113. //日平均风功率密度
  114. ArrayList<WindTowerCalculationData> wpdDayList = windTowerCalculationDataService.wpdDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  115. dataList.addAll(wpdDayList);
  116. //如果结束时间和数据统计的时间相差大于30天就分割月份进行计算
  117. if (endDate.getTime() - sevenDate.getTime() > 86400000L * 30) {
  118. List<Long> dateTime = DateTimeUtil.getIntervalTimeByMonth(DateTimeUtil.beginOfMonth(sevenDate), DateTimeUtil.beginOfMonth(endDate));
  119. for (Long l : dateTime) {
  120. //月平均风速
  121. ArrayList<WindTowerCalculationData> wsMonth = windTowerCalculationDataService.wsMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  122. dataList.addAll(wsMonth);
  123. //月平均风功率密度
  124. ArrayList<WindTowerCalculationData> wpdMonth = windTowerCalculationDataService.wpdMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  125. dataList.addAll(wpdMonth);
  126. //月平均湍流
  127. ArrayList<WindTowerCalculationData> turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  128. dataList.addAll(turbulenceMonth);
  129. //月平均空气密度
  130. ArrayList<WindTowerCalculationData> airDensityMonth = windTowerCalculationDataService.airDensityMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList);
  131. dataList.addAll(airDensityMonth);
  132. //月最大风速
  133. ArrayList<WindTowerCalculationData> wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  134. dataList.addAll(wsMaxMonth);
  135. //月平均风切变
  136. ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  137. dataList.addAll(shearMonth);
  138. //月平均风速标差
  139. ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  140. dataList.addAll(staMonth);
  141. //月玫瑰图
  142. windDirectionStatisticsDataService.roseMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList);
  143. //月平均环境数据
  144. ArrayList<WindTowerCalculationData> environmentData = windTowerCalculationDataService.environmentData(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList);
  145. dataList.addAll(environmentData);
  146. //空气密度月逐时
  147. ArrayList<WindTowerCalculationData> airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(windTowerInfo.getEquipmentNo(), DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseWeatherDataList);
  148. dataList.addAll(airDensityMonth1);
  149. //湍流月逐时
  150. ArrayList<WindTowerCalculationData> turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(windTowerInfo.getEquipmentNo(), DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  151. dataList.addAll(turbulenceHourForMonth);
  152. }
  153. } else {
  154. //空气密度月逐时
  155. ArrayList<WindTowerCalculationData> airDensityMonth = windTowerCalculationDataService.airDensityMonth(windTowerInfo.getEquipmentNo(), startMonthDate, endMonthDate, prophaseWeatherDataList);
  156. dataList.addAll(airDensityMonth);
  157. //湍流月逐时
  158. ArrayList<WindTowerCalculationData> turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(windTowerInfo.getEquipmentNo(), startMonthDate, endMonthDate, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  159. dataList.addAll(turbulenceHourForMonth);
  160. //月平均空气密度
  161. ArrayList<WindTowerCalculationData> airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList);
  162. dataList.addAll(airDensityMonth1);
  163. //月平均湍流
  164. ArrayList<WindTowerCalculationData> turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  165. dataList.addAll(turbulenceMonth);
  166. //月平均风速
  167. ArrayList<WindTowerCalculationData> wsMonth = windTowerCalculationDataService.wsMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  168. dataList.addAll(wsMonth);
  169. //月平均风功率密度
  170. ArrayList<WindTowerCalculationData> wpdMonth = windTowerCalculationDataService.wpdMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  171. dataList.addAll(wpdMonth);
  172. //月最大风速
  173. ArrayList<WindTowerCalculationData> wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  174. dataList.addAll(wsMaxMonth);
  175. //月平均风切变
  176. ArrayList<WindTowerCalculationData> shearMonth = windTowerCalculationDataService.shearMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList);
  177. dataList.addAll(shearMonth);
  178. //月平均风速标差
  179. ArrayList<WindTowerCalculationData> staMonth = windTowerCalculationDataService.staMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList);
  180. dataList.addAll(staMonth);
  181. //月环境数据 温湿压最大最小平均
  182. ArrayList<WindTowerCalculationData> environmentData = windTowerCalculationDataService.environmentData(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList);
  183. dataList.addAll(environmentData);
  184. // 月玫瑰图
  185. windDirectionStatisticsDataService.roseMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList);
  186. }
  187. // 统计概述
  188. statisticsSituationService.statisticsSituation(windTowerInfo, statisticsSituations, equipmentAttributeList);
  189. //保存
  190. windTowerCalculationDataService.saveBatchByEquipmentId(dataList, windTowerInfo.getEquipmentNo());
  191. }
  192. }
  193. //存储杨总数据 TODO 缺少TD Engine 逻辑
  194. public void saveJsonY() {
  195. String s = "";
  196. List<StationInfo> stationInfos = stationInfoService.selectStationInfo();
  197. for (StationInfo stationInfo : stationInfos) {
  198. JSONObject jsonObject = JSONUtil.parseObj(s);
  199. JSONObject jsonObject1 = JSONUtil.parseObj(jsonObject.get(stationInfo.getStationBasicInfo().getAbbreviation()));
  200. FanJsonInfo towerJsonInfo = jsonObject1.toBean(FanJsonInfo.class);
  201. List<String> collect = stationInfo.getFanTowerList().stream().map(FanTower::getFanModel).distinct().collect(Collectors.toList());
  202. String fdn = new BigDecimal(towerJsonInfo.getFd1n()).setScale(2, RoundingMode.HALF_UP).toString();
  203. for (String s1 : collect) {
  204. if (!s1.contains("MW")) {
  205. continue;
  206. }
  207. String s2 = CalculationUtil.getNumberFromStringForDian(s1);
  208. BigDecimal realTimeTotal = new BigDecimal(fdn).divide(new BigDecimal(s2), 2, BigDecimal.ROUND_HALF_UP);
  209. //一期
  210. FanModelData fanModelData = new FanModelData(UUID.randomUUID().toString(), stationInfo.getId(),
  211. stationInfo.getStationBasicInfo().getStationName(), s1, stationInfo.getStationBasicInfo().getAbbreviation(),
  212. new BigDecimal(towerJsonInfo.getPjfs()).setScale(2, RoundingMode.HALF_UP).toString(), towerJsonInfo.getZfx(),
  213. fdn, realTimeTotal.toString());
  214. fdn = new BigDecimal(towerJsonInfo.getFd2n()).setScale(2, RoundingMode.HALF_UP).toString();
  215. mongoTemplate.save(fanModelData);
  216. }
  217. }
  218. }
  219. }