|
@@ -0,0 +1,433 @@
|
|
|
+package com.jiayue.ipfcst.client.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.jiayue.ipfcst.client.aop.WR;
|
|
|
+import com.jiayue.ipfcst.client.mapper.JiaYueWindPowerCdqResultCoverMapperFD0017;
|
|
|
+import com.jiayue.ipfcst.client.mapper.JiaYueWindPowerCdqResultCoverMapperFD0018;
|
|
|
+import com.jiayue.ipfcst.client.service.*;
|
|
|
+import com.jiayue.ipfcst.common.core.util.DateMomentUtil;
|
|
|
+import com.jiayue.ipfcst.common.core.util.DateTimeUtil;
|
|
|
+import com.jiayue.ipp.common.data.entity.*;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.time.DateUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.sql.Time;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.time.Instant;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class JiaYueWindPowerCdqResultCoverFD0018ServiceImpl extends ServiceImpl<JiaYueWindPowerCdqResultCoverMapperFD0018, JiaYueWindPowerCdqResultCoverFD0018> implements JiaYueWindPowerCdqResultCoverFD0018Service {
|
|
|
+ private final JiaYueWindPowerCdqResultCoverMapperFD0018 jiaYueWindPowerCdqResultCoverMapperFD0018;
|
|
|
+
|
|
|
+ private final ElectricFieldService electricFieldService;
|
|
|
+
|
|
|
+ private final SysParameterService sysParameterService;
|
|
|
+
|
|
|
+ private final WindPowerReal15MinFD0018Service windPowerReal15MinFD0018Service;
|
|
|
+
|
|
|
+ private final JiaYueWindPowerDqResultCoverFD0018Service jiaYueWindPowerDqResultCoverFD0018Service;
|
|
|
+
|
|
|
+ private final WindFarmInfoEncryptionService windFarmInfoEncryptionService;
|
|
|
+
|
|
|
+ private final OverhaulPlanService overhaulPlanService;
|
|
|
+
|
|
|
+
|
|
|
+ public JiaYueWindPowerCdqResultCoverFD0018ServiceImpl(OverhaulPlanService overhaulPlanService, WindFarmInfoEncryptionService windFarmInfoEncryptionService, JiaYueWindPowerCdqResultCoverMapperFD0018 jiaYueWindPowerCdqResultCoverMapperFD0018, ElectricFieldService electricFieldService, SysParameterService sysParameterService, WindPowerReal15MinFD0018Service windPowerReal15MinFD0018Service, JiaYueWindPowerDqResultCoverFD0018Service jiaYueWindPowerDqResultCoverFD0018Service){
|
|
|
+ this.jiaYueWindPowerCdqResultCoverMapperFD0018 = jiaYueWindPowerCdqResultCoverMapperFD0018;
|
|
|
+ this.electricFieldService = electricFieldService;
|
|
|
+ this.sysParameterService = sysParameterService;
|
|
|
+ this.windPowerReal15MinFD0018Service = windPowerReal15MinFD0018Service;
|
|
|
+ this.jiaYueWindPowerDqResultCoverFD0018Service = jiaYueWindPowerDqResultCoverFD0018Service;
|
|
|
+ this.windFarmInfoEncryptionService = windFarmInfoEncryptionService;
|
|
|
+ this.overhaulPlanService = overhaulPlanService;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @WR("W")
|
|
|
+ public List<JiaYueWindPowerCdqResultCoverFD0018> get() {
|
|
|
+ List<JiaYueWindPowerCdqResultCoverFD0018> jiaYueWindPowerCdqResultCovers = jiaYueWindPowerCdqResultCoverMapperFD0018.selectList(null);
|
|
|
+ return jiaYueWindPowerCdqResultCovers;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+// @WR("R")
|
|
|
+ public int put(List<JiaYueWindPowerCdqResultCoverFD0018> jiaYueWindPowerCdqResultCoverFD0018List) {
|
|
|
+ if (jiaYueWindPowerCdqResultCoverFD0018List != null && jiaYueWindPowerCdqResultCoverFD0018List.size() > 0) {
|
|
|
+ this.saveBatch(jiaYueWindPowerCdqResultCoverFD0018List, jiaYueWindPowerCdqResultCoverFD0018List.size());
|
|
|
+ }
|
|
|
+ return jiaYueWindPowerCdqResultCoverFD0018List.size();
|
|
|
+ }
|
|
|
+
|
|
|
+// @Override
|
|
|
+// public List<JiaYueWindPowerCdqResultCover> getAll() {
|
|
|
+// List<JiaYueWindPowerCdqResultCover> jiaYueWindPowerCdqResultCovers = jiaYueWindPowerCdqResultCoverMapper.selectList(null);
|
|
|
+// return jiaYueWindPowerCdqResultCovers;
|
|
|
+// }
|
|
|
+
|
|
|
+ @Override
|
|
|
+// @WR("R")
|
|
|
+ public int deleteAll() {
|
|
|
+
|
|
|
+ return jiaYueWindPowerCdqResultCoverMapperFD0018.deleteAll();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 执行超短期预测
|
|
|
+ */
|
|
|
+ public void executeForecast() {
|
|
|
+
|
|
|
+ List<ElectricField> electricFieldList = new ArrayList<>();
|
|
|
+// ElectricField electricField1 = new ElectricField();
|
|
|
+// electricField1.setBelongForecastManufactor("SYJY");
|
|
|
+// electricField1.setCapacity(new BigDecimal(30.0000));
|
|
|
+// electricField1.setElectricFieldTypeEnum("2");
|
|
|
+// electricField1.setForecastManufactor("SYJY");
|
|
|
+// electricField1.setId("138c6aebdf6ddc792495bc35fa3e4adb");
|
|
|
+// electricField1.setName("天津中能融合测试站A");
|
|
|
+// electricField1.setStationCode("J00770");
|
|
|
+// electricField1.setSign("FD0001");
|
|
|
+// electricField1.setNetSubstationName("J00770");
|
|
|
+
|
|
|
+// ElectricField electricField2 = new ElectricField();
|
|
|
+// electricField2.setBelongForecastManufactor("SYJY");
|
|
|
+// electricField2.setCapacity(new BigDecimal(12.0000));
|
|
|
+// electricField2.setElectricFieldTypeEnum("2");
|
|
|
+// electricField2.setForecastManufactor("SYJY");
|
|
|
+// electricField2.setId("30a9f02678beb7101e628d7c7e22c5d6");
|
|
|
+// electricField2.setName("天津中能融合测试站C");
|
|
|
+// electricField2.setStationCode("J00772");
|
|
|
+// electricField2.setSign("FD0003");
|
|
|
+// electricField2.setNetSubstationName("J00772");
|
|
|
+
|
|
|
+ ElectricField electricField3 = new ElectricField();
|
|
|
+ electricField3.setBelongForecastManufactor("SYJY");
|
|
|
+ electricField3.setCapacity(new BigDecimal(49.5));
|
|
|
+ electricField3.setElectricFieldTypeEnum("2");
|
|
|
+ electricField3.setForecastManufactor("SYJY");
|
|
|
+ electricField3.setId("d712c1ef348714a5afafcf130c256cc9");
|
|
|
+ electricField3.setName("云南楚雄彝族自治州禄丰市松子沟村49.5MW风电场");
|
|
|
+ // todo
|
|
|
+ electricField3.setStationCode("J01122");
|
|
|
+ electricField3.setSign("FD0018");
|
|
|
+ electricField3.setNetSubstationName("J01122");
|
|
|
+
|
|
|
+// electricFieldList.add(electricField1);
|
|
|
+// electricFieldList.add(electricField2);
|
|
|
+ electricFieldList.add(electricField3);
|
|
|
+
|
|
|
+ electricFieldList.forEach(e -> {
|
|
|
+ String stationCode = e.getSign();
|
|
|
+ // 根据场站类型执行相应超短期预测
|
|
|
+ try {
|
|
|
+ // 获取查询时间,从当前时间所处时间点标记时间开始查询,截至到96个时间点对应的标记时间
|
|
|
+ String cdqUpMin = sysParameterService.getSysParameterAndStationCode("CDQ_UP_MIN", "0", stationCode);
|
|
|
+ Long calTime = DateMomentUtil.getMomentTime(System.currentTimeMillis() + Integer.parseInt(cdqUpMin) * 1000 * 60, 2, 15 * 60 * 1000L);
|
|
|
+ Long startTime = calTime + 15 * 1000 * 60L;
|
|
|
+ String llcdq_point = sysParameterService.getSysParameterAndStationCode("FILE_LLCDQ_POINT", "40", stationCode);
|
|
|
+ Integer forecastPoints = Integer.parseInt(llcdq_point);
|
|
|
+ Integer forecastMinutes = (forecastPoints - 1) * 15;
|
|
|
+ // 结束时间增加15分钟为了防止文件先生成,实时表中最后一个时间点没有点位的问题
|
|
|
+ Long endTime = DateUtils.addMinutes(new Date(startTime), forecastMinutes + 1).getTime();
|
|
|
+
|
|
|
+ // 查询该时间段内的短期预测功率
|
|
|
+ List<JiaYueWindPowerDqResultCoverFD0018> jiaYueWindPowerDqResultCoverFD0018List = jiaYueWindPowerDqResultCoverFD0018Service.findByObjIdAndStartTimeAndEndTime(stationCode, new Date(startTime), new Date(endTime));
|
|
|
+
|
|
|
+
|
|
|
+// List<ForecastPowerShortTerm> addForecastPowerShortTermList = new ArrayList<>();
|
|
|
+// // 判断短期数据是否缺点
|
|
|
+// for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + 15 * 60 * 1000L) {
|
|
|
+// if (forecastPowerShortTermsMap.get(tempTime) == null) {
|
|
|
+// // 缺失时间点
|
|
|
+// ForecastPowerShortTerm forecastPowerShortTerms = null;
|
|
|
+// if (ElectricFieldTypeEnum.E1.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
|
|
|
+// forecastPowerShortTerms = forecastPowerShortTermService.generateSolarPowerShortTerm(tempTime, openCapacityMap.get(tempTime), electricField);
|
|
|
+// } else {
|
|
|
+// forecastPowerShortTerms = forecastPowerShortTermService.generateWindPowerShortTerm(tempTime, openCapacityMap.get(tempTime));
|
|
|
+// }
|
|
|
+// addForecastPowerShortTermList.add(forecastPowerShortTerms);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// if (!addForecastPowerShortTermList.isEmpty()) {
|
|
|
+// // 保存短期预测
|
|
|
+// this.forecastPowerShortTermRepository.saveAll(addForecastPowerShortTermList);
|
|
|
+// // 将补齐的预测功率追加到查询预测功率结果集中
|
|
|
+// forecastPowerShortTermList.addAll(addForecastPowerShortTermList);
|
|
|
+// }
|
|
|
+
|
|
|
+ log.info("执行超短期预测生成。。。。。。{}", stationCode);
|
|
|
+// if (ElectricFieldTypeEnum.E1.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
|
|
|
+// // 光伏电站
|
|
|
+// this.executeForecastForlight(forecastPowerShortTermList, electricField.getCapacity());
|
|
|
+// } else if (ElectricFieldTypeEnum.E2.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
|
|
|
+ // 风力电场
|
|
|
+ this.executeForecastForWind(jiaYueWindPowerDqResultCoverFD0018List, e.getCapacity(), e.getStationCode());
|
|
|
+// } else {
|
|
|
+// log.error("场站类型非法!");
|
|
|
+// }
|
|
|
+
|
|
|
+ } catch (Exception ex) {
|
|
|
+ log.error("系统运行错误!", ex);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 执行风电场超短期预测
|
|
|
+ *
|
|
|
+ * @param jiaYueWindPowerDqResultCoverList 短期预测结果集
|
|
|
+ * @param capacity 装机容量
|
|
|
+ */
|
|
|
+ @WR("W")
|
|
|
+ public void executeForecastForWind(final List<JiaYueWindPowerDqResultCoverFD0018> jiaYueWindPowerDqResultCoverList, final BigDecimal capacity, String stationCode) {
|
|
|
+
|
|
|
+ List<JiaYueWindPowerCdqResultCoverFD0018> jiaYueWindPowerCdqResultCoverFD0018List = new ArrayList<>();
|
|
|
+ JiaYueWindPowerCdqResultCoverFD0018 jiaYueWindPowerCdqResultCoverFD0018;
|
|
|
+ //获取系统参数cdqjsfs,超短期计算方式,0为默认乘系数的方式,1为根据可用功率计算的方式
|
|
|
+ String cdqjsfs = sysParameterService.getSysParameterAndStationCode("cdqjsfs", "1", stationCode);
|
|
|
+ log.info("参数cdqjsfs值为:" + cdqjsfs + ",超短期计算方式,0为默认乘系数的方式,1为根据可用功率计算的方式。");
|
|
|
+ BigDecimal stPower, ustPower, ustPowers;
|
|
|
+ // 查询当前时间点标记时间前10分钟的可用功率
|
|
|
+ Date currentTime = new Date(System.currentTimeMillis());
|
|
|
+ Date startTime = DateUtils.addMinutes(currentTime, -10);
|
|
|
+ Date endTime = DateUtils.addMinutes(currentTime, 1);
|
|
|
+ // 场站编号转换为FD000?
|
|
|
+ String objId = electricFieldService.numberToIdentification(stationCode);
|
|
|
+ List<WindPowerReal15MinFD0018> windPowerReal15MinList = windPowerReal15MinFD0018Service.findByObjIdAndDateTime(objId, startTime, endTime);
|
|
|
+ List<WindPowerReal15MinFD0018> filterList = windPowerReal15MinList.stream().filter(t -> Float.compare(Float.valueOf(t.getActivePower()), Float.valueOf("-1")) > 0).collect(Collectors.toList());
|
|
|
+ String coe = sysParameterService.getSysParameterAndStationCode("CDQ_COE", "1.05", stationCode);
|
|
|
+
|
|
|
+ if (filterList.size() > 0) {
|
|
|
+ // 获取当前时刻对应的短期
|
|
|
+ List<JiaYueWindPowerDqResultCoverFD0018> currentForecastPowerShortTermList;
|
|
|
+ Float currentForecastPowerValue = 0f;
|
|
|
+ try {
|
|
|
+ Long currentMoment = DateMomentUtil.getMomentTime(currentTime.getTime(), 1, 15 * 60 * 1000L);
|
|
|
+ currentForecastPowerShortTermList = jiaYueWindPowerDqResultCoverFD0018Service.findByObjIdAndStartTimeAndEndTime(stationCode, new Date(currentMoment), new Date(currentMoment));
|
|
|
+ if (currentForecastPowerShortTermList.size() > 0) {
|
|
|
+ currentForecastPowerValue = currentForecastPowerShortTermList.get(0).getActivePower();
|
|
|
+ } else {
|
|
|
+ // 当前时间没有对应的短期,用实际功率最近的一个替换
|
|
|
+ filterList.sort(Comparator.comparing(WindPowerReal15MinFD0018::getDateTime).reversed());
|
|
|
+ currentForecastPowerValue = filterList.get(0).getActivePower().floatValue();
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal sumAbleValue = filterList.stream().map(s -> new BigDecimal(s.getActivePower())).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ BigDecimal averageAbleValue = sumAbleValue.divide(new BigDecimal(filterList.size()), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ //可用-短期差值
|
|
|
+ BigDecimal deviationValue = averageAbleValue.subtract(new BigDecimal(currentForecastPowerValue));
|
|
|
+ for (int i = 0; i < jiaYueWindPowerDqResultCoverList.size(); i++) {
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018 = new JiaYueWindPowerCdqResultCoverFD0018();
|
|
|
+ Long date = null;
|
|
|
+ try {
|
|
|
+ date = DateMomentUtil.getMomentTime(System.currentTimeMillis(), 2, 15 * 60 * 1000L);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+
|
|
|
+ Boolean is = this.isMidnight(date);
|
|
|
+
|
|
|
+ if (is == true) {
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setDataDate(this.nextDay(new Date()));
|
|
|
+ } else {
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setDataDate(new Date());
|
|
|
+ }
|
|
|
+
|
|
|
+ Date nowDate = DateTimeUtil.getMomentTimeFor15Minute(date);
|
|
|
+ Time nowTime = this.convertUtilDateToMySQLTime(nowDate);
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setDataTime(nowTime);
|
|
|
+// jiaYueWindPowerCdqResultCoverFD0007.setDataType(jiaYueWindPowerDqResultCoverList.get(i).getDataType());
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setPreDateTime(jiaYueWindPowerDqResultCoverList.get(i).getPreDateTime());
|
|
|
+// jiaYueWindPowerCdqResultCoverFD0007.setOpenCap(jiaYueWindPowerDqResultCoverList.get(i).getOpenCap());
|
|
|
+// jiaYueWindPowerCdqResultCoverFD0007.setDataFlg(jiaYueWindPowerDqResultCoverList.get(i).getDataFlg());
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setObjId(jiaYueWindPowerDqResultCoverList.get(i).getObjId());
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setCreateTime(LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault())); //短期
|
|
|
+ stPower = new BigDecimal(jiaYueWindPowerDqResultCoverList.get(i).getActivePower());
|
|
|
+ //短期*系数
|
|
|
+ ustPowers = stPower.multiply(new BigDecimal(coe)).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ // 如果短期预测小于等于0,则超短期为0
|
|
|
+ if (stPower.floatValue() <= 0) {
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setActivePower(0.0f);
|
|
|
+ } else {
|
|
|
+ BigDecimal xzjdq = deviationValue.add(stPower).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ String cdqjsfsZbxz = sysParameterService.getSysParameterAndStationCode("cdqjsfsZbxz", "0.4", stationCode);
|
|
|
+ log.debug("参数cdqjsfsZbxz值为:" + cdqjsfsZbxz + ",超短期计算方式,可用和短期的差值加短期占比。");
|
|
|
+ String cdqjsfsZbdq = sysParameterService.getSysParameterAndStationCode("cdqjsfsZbdq", "0.6", stationCode);
|
|
|
+ log.debug("参数cdqjsfsZbdq值为:" + cdqjsfsZbdq + ",超短期计算方式,短期占比。");
|
|
|
+ ustPower = xzjdq.multiply(new BigDecimal(cdqjsfsZbxz)).setScale(2, BigDecimal.ROUND_HALF_UP).add(stPower.multiply(new BigDecimal(cdqjsfsZbdq)).setScale(2, BigDecimal.ROUND_HALF_UP));
|
|
|
+
|
|
|
+ String[] value = this.openCap(jiaYueWindPowerDqResultCoverList.get(i).getPreDateTime(),objId,ustPower.floatValue()).split(":");
|
|
|
+ String[] aa = this.openCap(jiaYueWindPowerDqResultCoverList.get(i).getPreDateTime(),objId,ustPowers.floatValue()).split(":");
|
|
|
+ if (new BigDecimal(value[0]).doubleValue() > capacity.doubleValue()) {
|
|
|
+ // 如果超短期结果超出装机容量,则超短期结果为装机容量
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setActivePower(capacity.floatValue());
|
|
|
+ } else if (new BigDecimal(value[0]).doubleValue()< 0) {
|
|
|
+ // 如果超短期结果小于0,则超短期结果为0
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setActivePower(0f);
|
|
|
+ } else {
|
|
|
+ if (cdqjsfs.equals("1")) {
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setActivePower(new BigDecimal(value[0]).floatValue());
|
|
|
+ } else {
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setActivePower(new BigDecimal(aa[0]).floatValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setOpenCap(new BigDecimal(value[1]).floatValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018List.add(jiaYueWindPowerCdqResultCoverFD0018);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.info("库中没有可用,本次可用计算数据采用短期*系数的方式生成数据");
|
|
|
+ // 短期乘以系数
|
|
|
+ for (int i = 0; i < jiaYueWindPowerDqResultCoverList.size(); i++) {
|
|
|
+ stPower = new BigDecimal(jiaYueWindPowerDqResultCoverList.get(i).getActivePower());
|
|
|
+ ustPower = stPower.multiply(new BigDecimal(coe)).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018 = new JiaYueWindPowerCdqResultCoverFD0018();
|
|
|
+ Long date = null;
|
|
|
+ try {
|
|
|
+ date = DateMomentUtil.getMomentTime(System.currentTimeMillis(), 2, 15 * 60 * 1000L);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+
|
|
|
+ Boolean is = this.isMidnight(date);
|
|
|
+
|
|
|
+ if (is == true) {
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setDataDate(this.nextDay(new Date()));
|
|
|
+ } else {
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setDataDate(new Date());
|
|
|
+ }
|
|
|
+ String[] value = this.openCap(jiaYueWindPowerDqResultCoverList.get(i).getPreDateTime(),objId,ustPower.floatValue()).split(":");
|
|
|
+
|
|
|
+ Date nowDate = DateTimeUtil.getMomentTimeFor15Minute(date);
|
|
|
+ Time nowTime = this.convertUtilDateToMySQLTime(nowDate);
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setDataTime(nowTime);
|
|
|
+// jiaYueWindPowerCdqResultCoverFD0007.setDataType(jiaYueWindPowerDqResultCoverList.get(i).getDataType());
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setPreDateTime(jiaYueWindPowerDqResultCoverList.get(i).getPreDateTime());
|
|
|
+// jiaYueWindPowerCdqResultCoverFD0007.setDataFlg(jiaYueWindPowerDqResultCoverList.get(i).getDataFlg());
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setActivePower(new BigDecimal(value[0]).floatValue());
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setObjId(jiaYueWindPowerDqResultCoverList.get(i).getObjId());
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setOpenCap(new BigDecimal(value[1]).floatValue());
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018.setCreateTime(LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()));
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018List.add(jiaYueWindPowerCdqResultCoverFD0018);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (jiaYueWindPowerCdqResultCoverFD0018List.size() > 0) {
|
|
|
+ this.saveCdq(jiaYueWindPowerCdqResultCoverFD0018List, stationCode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @WR("W")
|
|
|
+ public void saveCdq(List<JiaYueWindPowerCdqResultCoverFD0018> jiaYueWindPowerCdqResultCoverList, String stationCode) {
|
|
|
+ this.saveBatch(jiaYueWindPowerCdqResultCoverList, jiaYueWindPowerCdqResultCoverList.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteByDateTime(LocalDateTime startTime, LocalDateTime endTime, String stationCode) {
|
|
|
+ jiaYueWindPowerCdqResultCoverMapperFD0018.deleteByDateTime(startTime, endTime, stationCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将Date格式转换为Time格式
|
|
|
+ *
|
|
|
+ * @param utilDate
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Time convertUtilDateToMySQLTime(Date utilDate) {
|
|
|
+ // 使用 SimpleDateFormat 提取时间部分
|
|
|
+ SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
|
|
|
+ String timeString = timeFormat.format(utilDate);
|
|
|
+ // 将提取的时间部分转换为 MySQL TIME 类型
|
|
|
+ return Time.valueOf(timeString);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<JiaYueWindPowerCdqResultCoverFD0018> findByDataDate(Date startTime) {
|
|
|
+
|
|
|
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ List<JiaYueWindPowerCdqResultCoverFD0018> jiaYueWindPowerCdqResultCoverFD0018List = new ArrayList<>();
|
|
|
+
|
|
|
+ for ( long time = startTime.getTime(); time < startTime.getTime() + 24 * 60 * 60 * 1000L - 1000; time = time + 15 * 60 * 1000L) {
|
|
|
+ Date date = new Date(time);
|
|
|
+ String dateSubString = simpleDateFormat.format(date);
|
|
|
+ JiaYueWindPowerCdqResultCoverFD0018 jiaYueWindPowerCdqResultCoverFD0018 = jiaYueWindPowerCdqResultCoverMapperFD0018.selectByDataDate(dateSubString);
|
|
|
+ if (null != jiaYueWindPowerCdqResultCoverFD0018){
|
|
|
+ jiaYueWindPowerCdqResultCoverFD0018List.add(jiaYueWindPowerCdqResultCoverFD0018);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return jiaYueWindPowerCdqResultCoverFD0018List;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断时间戳是否是0点0分
|
|
|
+ *
|
|
|
+ * @param timestamp
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean isMidnight(long timestamp) {
|
|
|
+ Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"));
|
|
|
+ calendar.setTimeInMillis(timestamp);
|
|
|
+
|
|
|
+ boolean isMidnight = // 小时为0
|
|
|
+ calendar.get(Calendar.HOUR_OF_DAY) == 0&&
|
|
|
+ calendar.get(Calendar.MINUTE) == 0 // 分钟为0
|
|
|
+ && calendar.get(Calendar.SECOND) == 0; // 秒为0
|
|
|
+ return isMidnight;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Date nextDay(Date date){
|
|
|
+ Calendar calendar = new GregorianCalendar();
|
|
|
+ calendar.setTime(date);
|
|
|
+ calendar.add(calendar.DATE, 1);
|
|
|
+ date = calendar.getTime();
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String openCap(LocalDateTime localDateTime,String objId,float bigDecimal){
|
|
|
+ // 查询场站并网容量
|
|
|
+ WindFarmInfoEncryption windFarmInfoEncryption = windFarmInfoEncryptionService.getCap(objId);
|
|
|
+ float cap = windFarmInfoEncryption.getCap();
|
|
|
+ BigDecimal capValue = new BigDecimal(cap);
|
|
|
+ Instant incomingTime = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
|
|
|
+ Instant queryTime = null;
|
|
|
+
|
|
|
+ // 查询检修计划
|
|
|
+ List<OverhaulPlan> overhaulPlanList = overhaulPlanService.getOverhaulPlan(localDateTime, objId);
|
|
|
+ if (null != overhaulPlanList && overhaulPlanList.size() > 0) {
|
|
|
+ for (OverhaulPlan overhaulPlan : overhaulPlanList) {
|
|
|
+ // 判断手动停止时间是否在预测数据时间之后
|
|
|
+ if (null != overhaulPlan.getMcTime()) {
|
|
|
+ queryTime = overhaulPlan.getMcTime().atZone(ZoneId.systemDefault()).toInstant();
|
|
|
+ if (queryTime.isAfter(incomingTime)){
|
|
|
+ BigDecimal bigDecimal1 = overhaulPlan.getOverhaulCapactity().divide(capValue, 2, RoundingMode.HALF_UP);
|
|
|
+ bigDecimal = new BigDecimal(bigDecimal).subtract(bigDecimal1.multiply(new BigDecimal(bigDecimal))).setScale(2,RoundingMode.HALF_UP).floatValue();
|
|
|
+ cap = cap - overhaulPlan.getOverhaulCapactity().floatValue();
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ BigDecimal bigDecimal1 = overhaulPlan.getOverhaulCapactity().divide(capValue, 2, RoundingMode.HALF_UP);
|
|
|
+ bigDecimal = new BigDecimal(bigDecimal).subtract(bigDecimal1.multiply(new BigDecimal(bigDecimal))).setScale(2,RoundingMode.HALF_UP).floatValue();
|
|
|
+ cap = cap - overhaulPlan.getOverhaulCapactity().floatValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String str = bigDecimal + ":" + cap;
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+}
|