|
@@ -4,9 +4,6 @@ import cn.hutool.core.date.DateField;
|
|
|
import cn.hutool.core.date.DateRange;
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
-import cn.hutool.core.text.csv.CsvUtil;
|
|
|
-import cn.hutool.core.text.csv.CsvWriter;
|
|
|
-import cn.hutool.core.util.CharsetUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.gyee.power.fitting.common.config.GyeeConfig;
|
|
|
import com.gyee.power.fitting.common.feign.RemoteServiceBuilder;
|
|
@@ -14,22 +11,22 @@ import com.gyee.power.fitting.model.PhotovoltaicAnalysis;
|
|
|
import com.gyee.power.fitting.model.ProBasicEquipment;
|
|
|
import com.gyee.power.fitting.model.ProBasicEquipmentPoint;
|
|
|
import com.gyee.power.fitting.model.ProEconEquipmentmodel;
|
|
|
-import com.gyee.power.fitting.model.custom.PhotovoltaicInfo;
|
|
|
import com.gyee.power.fitting.model.custom.TsDoubleData;
|
|
|
import com.gyee.power.fitting.service.IPhotovoltaicAnalysisService;
|
|
|
import com.gyee.power.fitting.service.ProBasicEquipmentPointService;
|
|
|
import com.gyee.power.fitting.service.ProBasicEquipmentService;
|
|
|
import com.gyee.power.fitting.service.ProEconEquipmentmodelService;
|
|
|
-import com.gyee.power.fitting.service.impl.IvPvCurveFittingService;
|
|
|
import com.gyee.power.fitting.service.impl.NewIvPvCurveFittingService;
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.stream.Collectors;
|
|
|
-import java.util.stream.Stream;
|
|
|
|
|
|
@Component
|
|
|
public class PhotovoltaicAnalysisTask {
|
|
@@ -72,21 +69,20 @@ public class PhotovoltaicAnalysisTask {
|
|
|
Map<String, Double> emMap = emList.stream().collect(Collectors.toMap(ProEconEquipmentmodel::getNemCode, ProEconEquipmentmodel::getPowerProduction));
|
|
|
|
|
|
//获取日发电量测点
|
|
|
- QueryWrapper<ProBasicEquipmentPoint> rfdlWrapper = new QueryWrapper<>();
|
|
|
- rfdlWrapper.eq("uniform_code", "RFDL").like("windturbine_id", "_IN_");
|
|
|
- List<ProBasicEquipmentPoint> rfdlList = proBasicEquipmentPointService.list(rfdlWrapper);
|
|
|
-// Map<String, Map<String, String>> rfdlPointsMap = rfdlList.stream().collect(Collectors.groupingBy(ProBasicEquipmentPoint::getWindpowerstationId,
|
|
|
-// Collectors.groupingBy(ProBasicEquipmentPoint::getModelId, Collectors.mapping(ProBasicEquipmentPoint::getNemCode, Collectors.joining(",")))));
|
|
|
- //String rfdlPoints = rfdlList.stream().map(ProBasicEquipmentPoint::getNemCode).collect(Collectors.joining(","));
|
|
|
+ List<ProBasicEquipmentPoint> rfdlList = getPointsByUniformcode("RFDL");
|
|
|
//逆变器id,日发电量测点
|
|
|
- Map<String, String> rfdlPointMap = rfdlList.stream().collect(Collectors.toMap(ProBasicEquipmentPoint::getWindturbineId, ProBasicEquipmentPoint::getNemCode));
|
|
|
+ Map<String, String> rfdlPointMap = points2InverterPointMap(rfdlList);
|
|
|
+ //获取有功功率测点
|
|
|
+ List<ProBasicEquipmentPoint> ygglList = getPointsByUniformcode("AI114");
|
|
|
+ //逆变器id,有功功率测点
|
|
|
+ Map<String, String> ygglPointMap = points2InverterPointMap(rfdlList);
|
|
|
+ //获取光照强度测点
|
|
|
+ List<ProBasicEquipmentPoint> gzqdList = getPointsByUniformcode("AI066");
|
|
|
+ //逆变器id,光照强度测点
|
|
|
+ Map<String, String> gzqdPointMap = points2InverterPointMap(rfdlList);
|
|
|
|
|
|
- //获取设备状态测点
|
|
|
- QueryWrapper<ProBasicEquipmentPoint> sbztWrapper = new QueryWrapper<>();
|
|
|
- sbztWrapper.eq("uniform_code", "SBZT").like("windturbine_id", "_IN_");
|
|
|
- List<ProBasicEquipmentPoint> sbztList = proBasicEquipmentPointService.list(sbztWrapper);
|
|
|
//逆变器id,设备状态测点
|
|
|
- Map<String, String> sbztPointMap = sbztList.stream().collect(Collectors.toMap(ProBasicEquipmentPoint::getWindturbineId, ProBasicEquipmentPoint::getNemCode));
|
|
|
+ Map<String, String> sbztPointMap = points2InverterPointMap(getPointsByUniformcode("SBZT"));
|
|
|
|
|
|
//获取光伏分析表最后计算日期
|
|
|
QueryWrapper<PhotovoltaicAnalysis> paWrapper = new QueryWrapper<>();
|
|
@@ -99,94 +95,103 @@ public class PhotovoltaicAnalysisTask {
|
|
|
DateTime endTime = dateTime.offsetNew(DateField.DAY_OF_YEAR, 1);
|
|
|
|
|
|
List<PhotovoltaicAnalysis> photovoltaicAnalyses = new ArrayList<>();
|
|
|
- equipmentMapMap.forEach((stationId, vv) -> {
|
|
|
- vv.forEach((modelId, equipments) -> {
|
|
|
- List<String> nbqs = equipments.stream().map(ProBasicEquipment::getId).collect(Collectors.toList());
|
|
|
- //逆变器,功率数据
|
|
|
- Map<String, List<PhotovoltaicInfo>> datas2File1 = curveFittingService.getDatas2File1(stationId, nbqs, dateTime.getTime(), endTime.getTime(), 5*60);
|
|
|
- //标准点
|
|
|
- List<PhotovoltaicInfo> bzdList = curveFittingService.standardPointCalculate1(datas2File1);
|
|
|
- //计算理论功率
|
|
|
- Map<String, List<PhotovoltaicInfo>> llglInfos = curveFittingService.calculatAnalysis1(bzdList, datas2File1);
|
|
|
-
|
|
|
- //测点、日发电量
|
|
|
- String points = rfdlList.stream().filter(rfdl -> nbqs.contains(rfdl.getWindturbineId())).map(ProBasicEquipmentPoint::getNemCode).collect(Collectors.joining(","));
|
|
|
- Map<String, TsDoubleData> rfdlMap = remoteService.adapterfd().getHistorySection(points, endTime.getTime());
|
|
|
-
|
|
|
- List<PhotovoltaicAnalysis> analysises = new ArrayList<>();
|
|
|
- //等效发电时之和
|
|
|
- AtomicReference<Double> hoursSum = new AtomicReference<>((double) 0);
|
|
|
- equipments.forEach(equipment -> {
|
|
|
- String equipmentId = equipment.getId();
|
|
|
- //逆变器日发电量测点
|
|
|
- String point = rfdlPointMap.get(equipmentId);
|
|
|
-
|
|
|
- PhotovoltaicAnalysis analysis = new PhotovoltaicAnalysis();
|
|
|
- analysis.setStationId(stationId);
|
|
|
- analysis.setProjectId(equipment.getProjectId());
|
|
|
- analysis.setLineId(equipment.getLineId());
|
|
|
- analysis.setEquipmentId(equipmentId);
|
|
|
- analysis.setDataDate(dateTime.toJdkDate());
|
|
|
-
|
|
|
- //设备状态
|
|
|
- List<TsDoubleData> sbztInfoList = remoteService.adapterfd().getRawValuesByKey(sbztPointMap.get(equipmentId), dateTime.getTime(), endTime.getTime());
|
|
|
- //计算故障导致停机时间
|
|
|
- double gzdztjSj = calcDowntimeByFailure(sbztInfoList);
|
|
|
- analysis.setMalfunctionTime(gzdztjSj);
|
|
|
- analysis.setDeviceAvailability((24 - gzdztjSj)*100 / 24);
|
|
|
-
|
|
|
- //日发电量
|
|
|
- double rfdl = rfdlMap.get(point).getDoubleValue();
|
|
|
- analysis.setGeneratingAmount(rfdl);
|
|
|
- //等效发电时
|
|
|
- double dxfds = inverterAnalysis.calcEquivalentOperatingHours(rfdl, emMap.get(equipment.getModelId()));
|
|
|
- analysis.setEquivalentGeneratingTime(dxfds);
|
|
|
-
|
|
|
- //离散率计算
|
|
|
- List<PhotovoltaicInfo> lslList = datas2File1.get(equipmentId);
|
|
|
- //平均功率
|
|
|
- List<PhotovoltaicInfo> collect = lslList.stream().filter(i -> i.getActualP() > 1).collect(Collectors.toList());
|
|
|
- double pjGl = collect.stream().mapToDouble(PhotovoltaicInfo::getActualP).average().orElse(0);
|
|
|
- analysis.setAveragePower(pjGl);
|
|
|
- //平均理论功率
|
|
|
- List<PhotovoltaicInfo> infoStream = llglInfos.get(equipmentId).stream().filter(i -> i.getIdeaP() > 1).collect(Collectors.toList());
|
|
|
- double pjLlgl = infoStream.stream().mapToDouble(PhotovoltaicInfo::getIdeaP).average().orElse(0);
|
|
|
- analysis.setAverageTheoryPower(pjLlgl);
|
|
|
- //光伏转换效率
|
|
|
- double zhxl = photovoltaicEfficiencyAnalysis.calculatePhotovoltaicEfficiency(pjGl, pjLlgl);
|
|
|
- analysis.setConversionEfficiency(zhxl);
|
|
|
- String zhxlZt = photovoltaicEfficiencyAnalysis.determinePhotovoltaicLevel(zhxl);
|
|
|
- analysis.setConversionEfficiencyStatus(zhxlZt);
|
|
|
- //离散率
|
|
|
- double lsl = inverterPowerAnalysis.calcPowerDeviation(lslList, pjGl);
|
|
|
- analysis.setScatter(lsl);
|
|
|
- String lslZt = inverterPowerAnalysis.analyzeInverterStatus(lsl, pjGl);
|
|
|
- analysis.setScatterStatus(lslZt);
|
|
|
-
|
|
|
- hoursSum.updateAndGet(v -> v + dxfds);
|
|
|
- analysises.add(analysis);
|
|
|
- });
|
|
|
- List<PhotovoltaicAnalysis> analysisList = analysises.stream().peek(pa -> {
|
|
|
- //平均等效发电时
|
|
|
- double pjDxfds = hoursSum.get() / analysises.size();
|
|
|
- pa.setAverageEquivalentGeneratingT(pjDxfds);
|
|
|
- //等效发电时标准差
|
|
|
- double dxfdsBzc = inverterAnalysis.calcStdDevEquivOperatHours(analysises, pjDxfds);
|
|
|
- pa.setEquivalentGeneratingTimeStan(dxfdsBzc);
|
|
|
- //等效发电时状态
|
|
|
- String dxfdsZt = inverterAnalysis.determineOperatingLevel(pa.getEquivalentGeneratingTime(), pjDxfds, dxfdsBzc);
|
|
|
- pa.setEquivalentGeneratingTimeStat(dxfdsZt);
|
|
|
- }).collect(Collectors.toList());
|
|
|
- photovoltaicAnalyses.addAll(analysisList);
|
|
|
+ equipmentMapMap.forEach((stationId, vv) -> vv.forEach((modelId, equipments) -> {
|
|
|
+ List<String> nbqs = equipments.stream().map(ProBasicEquipment::getId).collect(Collectors.toList());
|
|
|
+ /*//逆变器,功率数据
|
|
|
+ Map<String, List<PhotovoltaicInfo>> datas2File1 = curveFittingService.getDatas2File1(stationId, nbqs, dateTime.getTime(), endTime.getTime(), 5*60);
|
|
|
+ //标准点
|
|
|
+ List<PhotovoltaicInfo> bzdList = curveFittingService.standardPointCalculate1(datas2File1);
|
|
|
+ //计算理论功率
|
|
|
+ Map<String, List<PhotovoltaicInfo>> llglInfos = curveFittingService.calculatAnalysis1(bzdList, datas2File1);*/
|
|
|
+
|
|
|
+ //测点、日发电量
|
|
|
+ String points = rfdlList.stream().filter(rfdl -> nbqs.contains(rfdl.getWindturbineId())).map(ProBasicEquipmentPoint::getNemCode).collect(Collectors.joining(","));
|
|
|
+ Map<String, TsDoubleData> rfdlMap = remoteService.adapterfd().getHistorySection(points, endTime.getTime());
|
|
|
+
|
|
|
+ List<PhotovoltaicAnalysis> analysises = new ArrayList<>();
|
|
|
+ //等效发电时之和
|
|
|
+ AtomicReference<Double> hoursSum = new AtomicReference<>((double) 0);
|
|
|
+ equipments.forEach(equipment -> {
|
|
|
+ String equipmentId = equipment.getId();
|
|
|
+
|
|
|
+ PhotovoltaicAnalysis analysis = new PhotovoltaicAnalysis();
|
|
|
+ analysis.setStationId(stationId);
|
|
|
+ analysis.setProjectId(equipment.getProjectId());
|
|
|
+ analysis.setLineId(equipment.getLineId());
|
|
|
+ analysis.setEquipmentId(equipmentId);
|
|
|
+ analysis.setDataDate(dateTime.toJdkDate());
|
|
|
+
|
|
|
+ //设备状态
|
|
|
+ List<TsDoubleData> sbztInfoList = remoteService.adapterfd().getRawValuesByKey(sbztPointMap.get(equipmentId), dateTime.getTime(), endTime.getTime());
|
|
|
+ //计算故障导致停机时间
|
|
|
+ double gzdztjSj = calcDowntimeByFailure(sbztInfoList);
|
|
|
+ analysis.setMalfunctionTime(gzdztjSj);
|
|
|
+ analysis.setDeviceAvailability((24 - gzdztjSj) * 100 / 24);
|
|
|
+
|
|
|
+ //日发电量
|
|
|
+ double rfdl = rfdlMap.get(rfdlPointMap.get(equipmentId)).getDoubleValue();
|
|
|
+ analysis.setGeneratingAmount(rfdl);
|
|
|
+ //装机容量
|
|
|
+ Double zjrl = emMap.get(modelId);
|
|
|
+ //等效发电时
|
|
|
+ double dxfds = inverterAnalysis.calcEquivalentOperatingHours(rfdl, zjrl);
|
|
|
+ analysis.setEquivalentGeneratingTime(dxfds);
|
|
|
+ //有功功率
|
|
|
+ List<TsDoubleData> ygglInfoList = remoteService.adapterfd().getRawValuesByKey(ygglPointMap.get(equipmentId), dateTime.getTime(), endTime.getTime());
|
|
|
+ //平均功率
|
|
|
+ double pjGl = ygglInfoList.stream().filter(i -> i.getDoubleValue() > 1).mapToDouble(TsDoubleData::getDoubleValue).average().orElse(0);
|
|
|
+ analysis.setAveragePower(pjGl);
|
|
|
+
|
|
|
+ //光照强度
|
|
|
+ List<TsDoubleData> gzqdInfoList = remoteService.adapterfd().getRawValuesByKey(gzqdPointMap.get(equipmentId), dateTime.getTime(), endTime.getTime());
|
|
|
+ double pjGzqd = gzqdInfoList.stream().filter(i -> i.getDoubleValue() > 1).mapToDouble(TsDoubleData::getDoubleValue).average().orElse(0);
|
|
|
+
|
|
|
+ //平均理论功率
|
|
|
+ analysis.setAverageTheoryPower(pjGzqd);
|
|
|
+ //光伏转换效率
|
|
|
+ double zhxl = photovoltaicEfficiencyAnalysis.calculatePhotovoltaicEfficiency(pjGl, pjGzqd, zjrl);
|
|
|
+ analysis.setConversionEfficiency(zhxl);
|
|
|
+ String zhxlZt = photovoltaicEfficiencyAnalysis.determinePhotovoltaicLevel(zhxl);
|
|
|
+ analysis.setConversionEfficiencyStatus(zhxlZt);
|
|
|
+ //离散率
|
|
|
+ double lsl = inverterPowerAnalysis.calcPowerDeviation(gzqdInfoList, ygglInfoList, pjGl, dateTime.getTime(), endTime.getTime());
|
|
|
+ analysis.setScatter(lsl);
|
|
|
+ String lslZt = inverterPowerAnalysis.analyzeInverterStatus(lsl, pjGl);
|
|
|
+ analysis.setScatterStatus(lslZt);
|
|
|
+
|
|
|
+ hoursSum.updateAndGet(v -> v + dxfds);
|
|
|
+ analysises.add(analysis);
|
|
|
});
|
|
|
- });
|
|
|
+ List<PhotovoltaicAnalysis> analysisList = analysises.stream().peek(pa -> {
|
|
|
+ //平均等效发电时
|
|
|
+ double pjDxfds = hoursSum.get() / analysises.size();
|
|
|
+ pa.setAverageEquivalentGeneratingT(pjDxfds);
|
|
|
+ //等效发电时标准差
|
|
|
+ double dxfdsBzc = inverterAnalysis.calcStdDevEquivOperatHours(analysises, pjDxfds);
|
|
|
+ pa.setEquivalentGeneratingTimeStan(dxfdsBzc);
|
|
|
+ //等效发电时状态
|
|
|
+ String dxfdsZt = inverterAnalysis.determineOperatingLevel(pa.getEquivalentGeneratingTime(), pjDxfds, dxfdsBzc);
|
|
|
+ pa.setEquivalentGeneratingTimeStat(dxfdsZt);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ photovoltaicAnalyses.addAll(analysisList);
|
|
|
+ }));
|
|
|
photovoltaicAnalysisService.saveBatch(photovoltaicAnalyses);
|
|
|
-// CsvWriter writer = CsvUtil.getWriter(gyeeConfig.getGfDataPath() + "testWrite.csv", CharsetUtil.CHARSET_UTF_8);
|
|
|
-// writer.write(photovoltaicAnalyses);
|
|
|
+ // CsvWriter writer = CsvUtil.getWriter(gyeeConfig.getGfDataPath() + "testWrite.csv", CharsetUtil.CHARSET_UTF_8);
|
|
|
+ // writer.write(photovoltaicAnalyses);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private Map<String, String> points2InverterPointMap(List<ProBasicEquipmentPoint> pointList) {
|
|
|
+ return pointList.stream().collect(Collectors.toMap(ProBasicEquipmentPoint::getWindturbineId, ProBasicEquipmentPoint::getNemCode));
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<ProBasicEquipmentPoint> getPointsByUniformcode(String uniformcode) {
|
|
|
+ QueryWrapper<ProBasicEquipmentPoint> wrapper = new QueryWrapper<>();
|
|
|
+ wrapper.eq("uniform_code", uniformcode).like("windturbine_id", "_IN_");
|
|
|
+ return proBasicEquipmentPointService.list(wrapper);
|
|
|
+ }
|
|
|
+
|
|
|
private double calcDowntimeByFailure(List<TsDoubleData> sbztInfoList) {
|
|
|
sbztInfoList = sbztInfoList.stream().sorted(Comparator.comparing(TsDoubleData::getTs).reversed()).collect(Collectors.toList());
|
|
|
|