Bladeren bron

光伏分析4

xushili 1 jaar geleden
bovenliggende
commit
345d70aea1

+ 106 - 101
power-fitting-JN/src/main/java/com.gyee.power.fitting/dispersionanalysis/PhotovoltaicAnalysisTask.java

@@ -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());
 

+ 5 - 0
power-fitting-JN/src/main/java/com.gyee.power.fitting/model/custom/TsDoubleData.java

@@ -7,6 +7,11 @@ public class TsDoubleData {
     private int status;
     private double doubleValue;
 
+    public TsDoubleData(long ts, double doubleValue) {
+        this.ts = ts;
+        this.doubleValue = doubleValue;
+    }
+
     public long getTs() {
         return ts;
     }