package com.jiayue.biz.job; import cn.hutool.db.Entity; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.jiayue.biz.api.apiHDY; import com.jiayue.biz.domain.*; import com.jiayue.biz.service.*; import com.jiayue.biz.service.impl.*; import com.jiayue.biz.util.CalculationUtil; import com.jiayue.biz.util.DateTimeUtil; import com.jiayue.common.utils.DateUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.Timestamp; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service @EnableScheduling @AllArgsConstructor public class AirDensityJob { private final WindTowerCalculationDataServiceImpl windTowerCalculationDataService; private final WindTowerInfoServiceImpl windTowerInfoService; private final WindDirectionStatisticsDataServiceImpl windDirectionStatisticsDataService; private final EquipmentAttributeService equipmentAttributeService; private final StatisticsSituationServiceImpl statisticsSituationService; private final ProphaseAnemometryDataService prophaseAnemometryDataService; private final ProphaseWeatherDataService prophaseWeatherDataService; private final StationInfoService stationInfoService; private final MongoTemplate mongoTemplate; private final com.jiayue.biz.api.apiHDY apiHDY; @Scheduled(cron = "0 0 15 * * ?") public void AirDensityCalculation() { List windTowerInfoList = windTowerInfoService.list(); // 统计概述信息 List statisticsSituations = statisticsSituationService.list(); // 设备属性信息 List equipmentAttributeList = equipmentAttributeService.list(); //前7天 Date startDate = DateTimeUtil.getDayStartTime(new Date().getTime() - 60 * 60 * 24 * 1000 * 8); //前一天23点59分 Date endDate = DateTimeUtil.getDayLastTime(DateUtil.yesterday().getTime()); //传入时间的月初 Date startMonthDate = DateTimeUtil.beginOfMonth(startDate); //传入时间的月末 Date endMonthDate = DateTimeUtil.endOfMonth(endDate); for (WindTowerInfo windTowerInfo : windTowerInfoList) { Date sevenDate = startDate; Date startTime = startMonthDate; WindTowerCalculationData lastData = windTowerCalculationDataService.getLastDataCalculation(windTowerInfo.getEquipmentNo()); List lastRealData = prophaseWeatherDataService.getLastData(windTowerInfo.getEquipmentNo()); if (lastData != null && lastRealData != null){ Timestamp timestamp = (Timestamp) lastRealData.get(0).get("last (ts)"); long lastTime = DateUtil.endOfDay(lastData.getTime()).getTime(); long realTime = DateUtil.endOfDay(new Date(timestamp.getTime())).getTime(); if(lastTime == realTime){ continue; } if (realTime - lastTime >= 60 * 60 * 24 * 1000 * 8) { sevenDate = new Date(lastTime); } } if(sevenDate.getTime() < startMonthDate.getTime()){ startTime = sevenDate; } //风数据查询 List prophaseAnemometryDataList = prophaseAnemometryDataService.selectAll(windTowerInfo.getEquipmentNo(), new Timestamp(startTime.getTime()), new Timestamp(endDate.getTime())); //环境数据查询 List prophaseWeatherDataList = prophaseWeatherDataService.selectPublicData(windTowerInfo.getEquipmentNo(), new Timestamp(startTime.getTime()), new Timestamp(endDate.getTime())); //统计数据 List windTowerCalculationDataList = windTowerCalculationDataService.getByBetweenTimeAndEquipmentId(startTime, endDate, windTowerInfo.getEquipmentNo()); //小时平均风速风功率密度 ArrayList wsAndWpdList = windTowerCalculationDataService.calculateWindPowerDensity(sevenDate.getTime(), endDate.getTime(), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList); ArrayList dataList = new ArrayList<>(wsAndWpdList); //每小时风切变指数 ArrayList windShearList = windTowerCalculationDataService.calculateWindPowerShear(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, windTowerCalculationDataList); dataList.addAll(windShearList); //日平均温度 ArrayList tList = windTowerCalculationDataService.tDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList); dataList.addAll(tList); //日平均气压 ArrayList paList = windTowerCalculationDataService.paDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList); dataList.addAll(paList); //发电量与满发小时数 ArrayList calculateBattery = windTowerCalculationDataService.calculateBattery(sevenDate.getTime(), endDate.getTime(), windTowerInfo, prophaseAnemometryDataList, equipmentAttributeList, windTowerCalculationDataList); dataList.addAll(calculateBattery); //日平均空气密度 ArrayList airList = windTowerCalculationDataService.airDensityDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList, windTowerCalculationDataList); dataList.addAll(airList); //日平均风速标差 ArrayList staDay = windTowerCalculationDataService.calculateStaDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList); dataList.addAll(staDay); //日平均风速 ArrayList wsDayList = windTowerCalculationDataService.wsDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(wsDayList); //日平均湍流 ArrayList turList = windTowerCalculationDataService.turbulenceDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), equipmentAttributeList, windTowerInfoList, windTowerCalculationDataList); dataList.addAll(turList); //日平均风切变 ArrayList windShearDay = windTowerCalculationDataService.shearDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList); dataList.addAll(windShearDay); //日平均风功率密度 ArrayList wpdDayList = windTowerCalculationDataService.wpdDay(sevenDate, endDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(wpdDayList); //如果结束时间和数据统计的时间相差大于30天就分割月份进行计算 if (endDate.getTime() - sevenDate.getTime() > 86400000L * 30) { List dateTime = DateTimeUtil.getIntervalTimeByMonth(DateTimeUtil.beginOfMonth(sevenDate), DateTimeUtil.beginOfMonth(endDate)); for (Long l : dateTime) { //月平均风速 ArrayList wsMonth = windTowerCalculationDataService.wsMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(wsMonth); //月平均风功率密度 ArrayList wpdMonth = windTowerCalculationDataService.wpdMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(wpdMonth); //月平均湍流 ArrayList turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(turbulenceMonth); //月平均空气密度 ArrayList airDensityMonth = windTowerCalculationDataService.airDensityMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList); dataList.addAll(airDensityMonth); //月最大风速 ArrayList wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(wsMaxMonth); //月平均风切变 ArrayList shearMonth = windTowerCalculationDataService.shearMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList); dataList.addAll(shearMonth); //月平均风速标差 ArrayList staMonth = windTowerCalculationDataService.staMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(staMonth); //月玫瑰图 windDirectionStatisticsDataService.roseMonth(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList); //月平均环境数据 ArrayList environmentData = windTowerCalculationDataService.environmentData(DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList); dataList.addAll(environmentData); //空气密度月逐时 ArrayList airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(windTowerInfo.getEquipmentNo(), DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseWeatherDataList); dataList.addAll(airDensityMonth1); //湍流月逐时 ArrayList turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(windTowerInfo.getEquipmentNo(), DateTimeUtil.beginOfMonth(new Date(l)), DateTimeUtil.endOfMonth(new Date(l)), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(turbulenceHourForMonth); } } else { //空气密度月逐时 ArrayList airDensityMonth = windTowerCalculationDataService.airDensityMonth(windTowerInfo.getEquipmentNo(), startMonthDate, endMonthDate, prophaseWeatherDataList); dataList.addAll(airDensityMonth); //湍流月逐时 ArrayList turbulenceHourForMonth = windTowerCalculationDataService.turbulenceHourForMonth(windTowerInfo.getEquipmentNo(), startMonthDate, endMonthDate, prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(turbulenceHourForMonth); //月平均空气密度 ArrayList airDensityMonth1 = windTowerCalculationDataService.airDensityMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList); dataList.addAll(airDensityMonth1); //月平均湍流 ArrayList turbulenceMonth = windTowerCalculationDataService.turbulenceMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(turbulenceMonth); //月平均风速 ArrayList wsMonth = windTowerCalculationDataService.wsMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(wsMonth); //月平均风功率密度 ArrayList wpdMonth = windTowerCalculationDataService.wpdMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(wpdMonth); //月最大风速 ArrayList wsMaxMonth = windTowerCalculationDataService.wsMaxMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(wsMaxMonth); //月平均风切变 ArrayList shearMonth = windTowerCalculationDataService.shearMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), windTowerCalculationDataList, equipmentAttributeList, windTowerInfoList,prophaseAnemometryDataList); dataList.addAll(shearMonth); //月平均风速标差 ArrayList staMonth = windTowerCalculationDataService.staMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, equipmentAttributeList, windTowerInfoList); dataList.addAll(staMonth); //月环境数据 温湿压最大最小平均 ArrayList environmentData = windTowerCalculationDataService.environmentData(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseWeatherDataList, equipmentAttributeList); dataList.addAll(environmentData); // 月玫瑰图 windDirectionStatisticsDataService.roseMonth(startMonthDate, endMonthDate, windTowerInfo.getEquipmentNo(), prophaseAnemometryDataList, prophaseWeatherDataList, equipmentAttributeList); } // 统计概述 statisticsSituationService.statisticsSituation(windTowerInfo, statisticsSituations, equipmentAttributeList); //保存 windTowerCalculationDataService.saveBatchByEquipmentId(dataList, windTowerInfo.getEquipmentNo()); } } //存储杨总数据 TODO 缺少TD Engine 逻辑 public void saveJsonY() { String s = apiHDY.jsonY(DateUtil.format(new Date(),"yyyyMMdd")); List stationInfos = stationInfoService.selectStationInfo(); for (StationInfo stationInfo : stationInfos) { JSONObject jsonObject = JSONUtil.parseObj(s); JSONObject jsonObject1 = JSONUtil.parseObj(jsonObject.get(stationInfo.getStationBasicInfo().getAbbreviation())); FanJsonInfo towerJsonInfo = jsonObject1.toBean(FanJsonInfo.class); List collect = stationInfo.getFanTowerList().stream().map(FanTower::getFanModel).distinct().collect(Collectors.toList()); String fdn = new BigDecimal(towerJsonInfo.getFd1n()).setScale(2, RoundingMode.HALF_UP).toString(); for (String s1 : collect) { if (!s1.contains("MW")) { continue; } String s2 = CalculationUtil.getNumberFromStringForDian(s1); BigDecimal realTimeTotal = new BigDecimal(fdn).divide(new BigDecimal(s2), 2, BigDecimal.ROUND_HALF_UP); //一期 FanModelData fanModelData = new FanModelData(UUID.randomUUID().toString(), stationInfo.getId(), stationInfo.getStationBasicInfo().getStationName(), s1, stationInfo.getStationBasicInfo().getAbbreviation(), new BigDecimal(towerJsonInfo.getPjfs()).setScale(2, RoundingMode.HALF_UP).toString(), towerJsonInfo.getZfx(), fdn, realTimeTotal.toString()); fdn = new BigDecimal(towerJsonInfo.getFd2n()).setScale(2, RoundingMode.HALF_UP).toString(); mongoTemplate.save(fanModelData); } } } }