|
@@ -0,0 +1,534 @@
|
|
|
|
+package com.gyee.power.fitting.service.impl;
|
|
|
|
+
|
|
|
|
+import com.gyee.power.fitting.common.alg.CurrentVoltageCalc;
|
|
|
|
+import com.gyee.power.fitting.common.alg.PolynomialCurveFitting;
|
|
|
|
+import com.gyee.power.fitting.common.config.GyeeConfig;
|
|
|
|
+import com.gyee.power.fitting.common.constants.Constants;
|
|
|
|
+import com.gyee.power.fitting.common.feign.IAdapterService;
|
|
|
|
+import com.gyee.power.fitting.common.spring.InitialRunner;
|
|
|
|
+import com.gyee.power.fitting.common.util.DateUtils;
|
|
|
|
+import com.gyee.power.fitting.common.util.FileUtil;
|
|
|
|
+import com.gyee.power.fitting.common.util.PowerFittingUtil;
|
|
|
|
+import com.gyee.power.fitting.model.Powerfittinganalysis;
|
|
|
|
+import com.gyee.power.fitting.model.Windpowerstationtestingpoint2;
|
|
|
|
+import com.gyee.power.fitting.model.Windturbinetestingpointai2;
|
|
|
|
+import com.gyee.power.fitting.model.anno.AnnotationTool;
|
|
|
|
+import com.gyee.power.fitting.model.anno.FixedVo;
|
|
|
|
+import com.gyee.power.fitting.model.custom.FjjxbVo;
|
|
|
|
+import com.gyee.power.fitting.model.custom.PhotovoltaicInfo;
|
|
|
|
+import com.gyee.power.fitting.model.custom.TableTitle;
|
|
|
|
+import com.gyee.power.fitting.model.custom.TsDoubleData;
|
|
|
|
+import com.gyee.power.fitting.service.IWindpowerstationtestingpoint2Service;
|
|
|
|
+import com.gyee.power.fitting.service.Windturbinetestingpointai2Service;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.apache.commons.math3.fitting.WeightedObservedPoints;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+import java.io.File;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.*;
|
|
|
|
+import java.util.function.Function;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
+
|
|
|
|
+@Service
|
|
|
|
+public class IvPvCurveFittingService {
|
|
|
|
+
|
|
|
|
+ @Resource
|
|
|
|
+ private IWindpowerstationtestingpoint2Service windpowerstationtestingpoint2Service;
|
|
|
|
+ @Resource
|
|
|
|
+ private Windturbinetestingpointai2Service windturbinetestingpointai2Service;
|
|
|
|
+ @Resource
|
|
|
|
+ private IAdapterService adpClient;
|
|
|
|
+ @Resource
|
|
|
|
+ private GyeeConfig config;
|
|
|
|
+ @Resource
|
|
|
|
+ private PolynomialCurveFitting pncf;
|
|
|
|
+
|
|
|
|
+ public void getDatas2File(String stationid, long start, long end) {
|
|
|
|
+
|
|
|
|
+ int daym = 24 * 60 * 60 * 1000;
|
|
|
|
+
|
|
|
|
+ //按天
|
|
|
|
+ for (long i = start; i < end; i += daym) {
|
|
|
|
+
|
|
|
|
+ List<List<PhotovoltaicInfo>> datas = getDatas(stationid, i, i + daym);
|
|
|
|
+ infos2File(datas);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void infos2File(List<List<PhotovoltaicInfo>> datas) {
|
|
|
|
+
|
|
|
|
+ //文件第一行
|
|
|
|
+ List<FixedVo> fixedVos = AnnotationTool.getFixedVoList(PhotovoltaicInfo.class);
|
|
|
|
+ String columnName = fixedVos.stream().map(FixedVo::getDes).collect(Collectors.joining(","));
|
|
|
|
+ //遍历逆变器
|
|
|
|
+ for (List<PhotovoltaicInfo> data : datas) {
|
|
|
|
+ PhotovoltaicInfo info = data.get(0);
|
|
|
|
+ String station = info.getStation();
|
|
|
|
+ String fileName = config.getFilePathPrepare() + "gf\\" + station + "-" + info.getInverter() + "-" + DateUtils.date2StringS(new Date(info.getTime())) + ".csv";
|
|
|
|
+ File file = new File(fileName);
|
|
|
|
+ if (file.exists()) continue;
|
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
|
+ sb.append(columnName).append("\n");
|
|
|
|
+ for (PhotovoltaicInfo datum : data) {
|
|
|
|
+ sb.append(datum.getStation()).append(",").append(datum.getInverter()).append(",").append(DateUtils.date2StringL(new Date(datum.getTime())))
|
|
|
|
+ .append(",").append(datum.getT()).append(",").append(datum.getS()).append(",").append(datum.getI()).append(",").append(datum.getV())
|
|
|
|
+ .append(",").append(datum.getActualP()).append(",").append(datum.getAI()).append(",").append(datum.getAV()).append(",")
|
|
|
|
+ .append(datum.getBI()).append(",").append(datum.getBV()).append(",").append(datum.getCI()).append(",").append(datum.getCV())
|
|
|
|
+ .append("\n");
|
|
|
|
+ }
|
|
|
|
+ FileUtil.writeFile(fileName, sb.toString());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public List<String> getFileList(String station, List<String> nbq, long startdate, long enddate, boolean isOffline) {
|
|
|
|
+ List<String> fileList = new ArrayList<>();
|
|
|
|
+ //获取文件位置
|
|
|
|
+ File file = new File(config.getFilePathPrepare() + "gf");
|
|
|
|
+ //获取文件列表
|
|
|
|
+ File[] files = file.listFiles();
|
|
|
|
+ //如果文件不够,返回null
|
|
|
|
+ for (long i = startdate; i < enddate; i += 24 * 60 * 60 * 1000) {
|
|
|
|
+ int size = fileList.size();
|
|
|
|
+ String s = DateUtils.date2StringS(new Date(i));
|
|
|
|
+ for (File f : files) {
|
|
|
|
+ if (f.getName().contains(station) && f.getName().contains(s) && jiancha(f.getName(), nbq))
|
|
|
|
+ fileList.add(f.getName());
|
|
|
|
+ }
|
|
|
|
+ if (fileList.size() == size && !isOffline) return null;
|
|
|
|
+ }
|
|
|
|
+ return fileList;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private boolean jiancha(String name, List<String> nbq) {
|
|
|
|
+ for (String s : nbq) {
|
|
|
|
+ if (name.contains(s)) return true;
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public Map<String, Object> getTable(String s) {
|
|
|
|
+ List<FixedVo> fixedVos = AnnotationTool.getFixedVoList(PhotovoltaicInfo.class);
|
|
|
|
+ List<TableTitle> collect = fixedVos.stream().map(d -> new TableTitle(d.getName(), d.getDes())).collect(Collectors.toList());
|
|
|
|
+ Map<String, Object> tableMap = new HashMap<>();
|
|
|
|
+ String fs = config.getFilePathPrepare() + "gf\\" + s;
|
|
|
|
+ List<PhotovoltaicInfo> infos = file2Info(fs, false);
|
|
|
|
+ tableMap.put("data", infos);
|
|
|
|
+ tableMap.put("title", collect);
|
|
|
|
+ return tableMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private List<PhotovoltaicInfo> file2Info(String path, boolean isAll) {
|
|
|
|
+ List<String> strings = FileUtil.readFile(path, isAll);
|
|
|
|
+ List<PhotovoltaicInfo> infos = new ArrayList<>();
|
|
|
|
+ for (int i = 1; i < strings.size(); i++) {
|
|
|
|
+ String[] split = strings.get(i).split(",");
|
|
|
|
+ PhotovoltaicInfo info = new PhotovoltaicInfo();
|
|
|
|
+ try {
|
|
|
|
+ info.setStation(split[0]);
|
|
|
|
+ info.setInverter(split[1]);
|
|
|
|
+ if (!"".equals(split[2])) {
|
|
|
|
+ info.setTime(DateUtils.string2DateL(split[2]).getTime());
|
|
|
|
+ info.setDatetime(split[2]);
|
|
|
|
+ }
|
|
|
|
+ info.setT(StringUtils.isBlank(split[3]) ? 0 : Double.parseDouble(split[3]));
|
|
|
|
+ info.setS(StringUtils.isBlank(split[4]) ? 0 : Double.parseDouble(split[4]));
|
|
|
|
+ info.setI(StringUtils.isBlank(split[5]) ? 0 : Double.parseDouble(split[5]));
|
|
|
|
+ info.setV(StringUtils.isBlank(split[6]) ? 0 : Double.parseDouble(split[6]));
|
|
|
|
+ info.setActualP(StringUtils.isBlank(split[7]) ? 0 : Double.parseDouble(split[7]));
|
|
|
|
+ info.setAI(StringUtils.isBlank(split[8]) ? 0 : Double.parseDouble(split[8]));
|
|
|
|
+ info.setAV(StringUtils.isBlank(split[9]) ? 0 : Double.parseDouble(split[9]));
|
|
|
|
+ info.setBI(StringUtils.isBlank(split[10]) ? 0 : Double.parseDouble(split[10]));
|
|
|
|
+ info.setBV(StringUtils.isBlank(split[11]) ? 0 : Double.parseDouble(split[11]));
|
|
|
|
+ info.setCI(StringUtils.isBlank(split[12]) ? 0 : Double.parseDouble(split[12]));
|
|
|
|
+ info.setCV(StringUtils.isBlank(split[13]) ? 0 : Double.parseDouble(split[13]));
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ System.out.println();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ infos.add(info);
|
|
|
|
+ }
|
|
|
|
+ return infos;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 计算理论功率加入原列表
|
|
|
|
+ *
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Map<String, List<PhotovoltaicInfo>> calculatAnalysis(List<String> fileList) {
|
|
|
|
+
|
|
|
|
+ String bzcldPath = config.getFilePathPrepare() + "bzd\\标准点.csv";
|
|
|
|
+ List<PhotovoltaicInfo> bzclds = file2Info(bzcldPath, true);
|
|
|
|
+ Map<String, PhotovoltaicInfo> bzcldMap = bzclds.stream().collect(Collectors.toMap(PhotovoltaicInfo::getInverter, Function.identity()));
|
|
|
|
+
|
|
|
|
+ String fs = config.getFilePathPrepare() + "gf\\";
|
|
|
|
+ Map<String, List<PhotovoltaicInfo>> stringListMap = new HashMap<>();
|
|
|
|
+ for (String s : fileList) {
|
|
|
|
+ //读取一个文件
|
|
|
|
+ List<PhotovoltaicInfo> infos = file2Info(fs + s, true);
|
|
|
|
+ List<PhotovoltaicInfo> theoryInfos;
|
|
|
|
+ if (s.contains("HZJ_GDC") || s.contains("AK_GDC")) {
|
|
|
|
+ theoryInfos = CurrentVoltageCalc.CalcTheoryPowerHZJ(infos, bzcldMap);
|
|
|
|
+ } else {
|
|
|
|
+ theoryInfos = CurrentVoltageCalc.CalcTheoryPower(infos, bzcldMap);
|
|
|
|
+ }
|
|
|
|
+ //按逆变器聚合数据
|
|
|
|
+ if (stringListMap.containsKey(theoryInfos.get(0).getInverter())) {
|
|
|
|
+ stringListMap.get(theoryInfos.get(0).getInverter()).addAll(theoryInfos);
|
|
|
|
+ } else {
|
|
|
|
+ stringListMap.put(theoryInfos.get(0).getInverter(), theoryInfos);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return stringListMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 合并同逆变器文件
|
|
|
|
+ *
|
|
|
|
+ * @param fileList
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Map<String, List<PhotovoltaicInfo>> mergeCalculat(List<String> fileList) {
|
|
|
|
+
|
|
|
|
+ String fs = config.getFilePathPrepare() + "gf\\";
|
|
|
|
+ Map<String, List<PhotovoltaicInfo>> stringListMap = new HashMap<>();
|
|
|
|
+ for (String s : fileList) {
|
|
|
|
+ //读取一个文件
|
|
|
|
+ List<PhotovoltaicInfo> infos = file2Info(fs + s, true);
|
|
|
|
+ //按逆变器聚合数据
|
|
|
|
+ if (stringListMap.containsKey(infos.get(0).getInverter())) {
|
|
|
|
+ stringListMap.get(infos.get(0).getInverter()).addAll(infos);
|
|
|
|
+ } else {
|
|
|
|
+ stringListMap.put(infos.get(0).getInverter(), infos);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return stringListMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public List<Object> str2FileList(List<String> fileList) {
|
|
|
|
+ List<Powerfittinganalysis> fileLists = new ArrayList<>();
|
|
|
|
+ for (String s : fileList) {
|
|
|
|
+ String[] split = s.split("-");
|
|
|
|
+ Powerfittinganalysis fl = new Powerfittinganalysis();
|
|
|
|
+ /*fl.setPath(s);
|
|
|
|
+ fl.setStation(split[0]);
|
|
|
|
+ fl.setStationcn(InitialRunner.gfstationMap.get(split[0]));
|
|
|
|
+ fl.setWindturbine(split[1]);
|
|
|
|
+ fl.setTime(split[2]+"年"+split[3]+"月");
|
|
|
|
+ fl.setInterval("五分钟");*/
|
|
|
|
+ fl.setPath(s);
|
|
|
|
+ fl.setStation(split[0]);
|
|
|
|
+ fl.setStationcn(split[1]);
|
|
|
|
+ fl.setWindturbine(split[1]);
|
|
|
|
+ fl.setTime(InitialRunner.gfstationMap.get(split[0]));
|
|
|
|
+ fl.setInterval(split[2] + "年" + split[3] + "月");
|
|
|
|
+ fileLists.add(fl);
|
|
|
|
+ }
|
|
|
|
+ List<Object> objects = PowerFittingUtil.powerDataTree(fileLists, Constants.DATA_FITTING);
|
|
|
|
+ return objects;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public List<String> getAllFileList() {
|
|
|
|
+ //获取文件位置
|
|
|
|
+ File file = new File(config.getFilePathPrepare() + "gf");
|
|
|
|
+ //获取文件列表
|
|
|
|
+ File[] files = file.listFiles();
|
|
|
|
+ List<String> fileList = Arrays.stream(files).map(f -> f.getName()).collect(Collectors.toList());
|
|
|
|
+ return fileList;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 标准点计算
|
|
|
|
+ */
|
|
|
|
+ public void standardPointCalculate2() {
|
|
|
|
+ List<String> allFileList = getAllFileList();
|
|
|
|
+ Map<String, List<PhotovoltaicInfo>> stringListMap = mergeCalculat(allFileList);
|
|
|
|
+
|
|
|
|
+ List<PhotovoltaicInfo> ptInfos = new ArrayList<>();
|
|
|
|
+ for (Map.Entry<String, List<PhotovoltaicInfo>> entry : stringListMap.entrySet()) {
|
|
|
|
+ List<PhotovoltaicInfo> value = entry.getValue();
|
|
|
|
+ Optional<PhotovoltaicInfo> first = value.stream().sorted(Comparator.comparing(PhotovoltaicInfo::getActualP).reversed()).findFirst();
|
|
|
|
+ ptInfos.add(first.get());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //文件第一行
|
|
|
|
+ List<FixedVo> fixedVos = AnnotationTool.getFixedVoList(PhotovoltaicInfo.class);
|
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
|
+ String columnName = fixedVos.stream().map(FixedVo::getDes).collect(Collectors.joining(","));
|
|
|
|
+ sb.append(columnName).append("\n");
|
|
|
|
+ for (PhotovoltaicInfo ptInfo : ptInfos) {
|
|
|
|
+ sb.append(ptInfo.getStation()).append(",").append(ptInfo.getInverter()).append(",")
|
|
|
|
+ .append(DateUtils.date2StringL(new Date(ptInfo.getTime()))).append(",")
|
|
|
|
+ .append(ptInfo.getT()).append(",").append(ptInfo.getS()).append(",")
|
|
|
|
+ .append(ptInfo.getI()).append(",").append(ptInfo.getV())
|
|
|
|
+ .append(",").append(ptInfo.getActualP()).append(",")
|
|
|
|
+ .append(ptInfo.getAI()).append(",").append(ptInfo.getAV())
|
|
|
|
+ .append(",").append(ptInfo.getBI()).append(",").append(ptInfo.getBV())
|
|
|
|
+ .append(",").append(ptInfo.getCI()).append(",").append(ptInfo.getCV())
|
|
|
|
+ .append("\n");
|
|
|
|
+ }
|
|
|
|
+ String fileName = config.getFilePathPrepare() + "bzd\\标准点.csv";
|
|
|
|
+ File file = new File(fileName);
|
|
|
|
+ file.delete();
|
|
|
|
+ FileUtil.writeFile(fileName, sb.toString());
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public List<TableTitle> getTheoryTitel() {
|
|
|
|
+
|
|
|
|
+ List<FixedVo> fixedVos = AnnotationTool.getFixedVoList(PhotovoltaicInfo.class);
|
|
|
|
+ String[] ss = {"station", "datetime", "T", "S", "actualP"};
|
|
|
|
+ List<String> strings = Arrays.asList(ss);
|
|
|
|
+ List<TableTitle> collect = fixedVos.stream().map(d -> new TableTitle(d.getName(), d.getDes())).collect(Collectors.toList());
|
|
|
|
+ collect = collect.stream().filter(c -> strings.contains(c.getKey())).collect(Collectors.toList());
|
|
|
|
+ TableTitle title = new TableTitle();
|
|
|
|
+ title.setKey("ideaP");
|
|
|
|
+ title.setDes("理论功率");
|
|
|
|
+ collect.add(title);
|
|
|
|
+
|
|
|
|
+ return collect;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获得所有文件的值
|
|
|
|
+ *
|
|
|
|
+ * @param fileList
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<PhotovoltaicInfo> calculatFitting(List<String> fileList) {
|
|
|
|
+
|
|
|
|
+ String fs = config.getFilePathPrepare() + "gf\\";
|
|
|
|
+ List<PhotovoltaicInfo> infoList = new ArrayList<>();
|
|
|
|
+ for (String s : fileList) {
|
|
|
|
+ List<PhotovoltaicInfo> infos = file2Info(fs + s, true);
|
|
|
|
+ if (infoList.size() == 0 || Objects.equals(infos.get(0).getStation(), infoList.get(0).getStation())) {
|
|
|
|
+ infoList.addAll(infos);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return infoList;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public List<double[]> oneFileFitting(List<PhotovoltaicInfo> infos) {
|
|
|
|
+
|
|
|
|
+ WeightedObservedPoints points = new WeightedObservedPoints();
|
|
|
|
+ double max = 0;
|
|
|
|
+ for (PhotovoltaicInfo info : infos) {
|
|
|
|
+ if (info.getS() < 1) {
|
|
|
|
+ points.add(0, 0);
|
|
|
|
+ }
|
|
|
|
+ points.add(info.getS(), info.getActualP());
|
|
|
|
+ if (info.getS() > max) {
|
|
|
|
+ max = info.getS();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ double[] result = pncf.run(points);
|
|
|
|
+
|
|
|
|
+ List<double[]> b = new ArrayList<>();
|
|
|
|
+ for (int i = 0; i < max; i += 5) {
|
|
|
|
+ double[] curve = new double[2];
|
|
|
|
+ curve[0] = i;
|
|
|
|
+ curve[1] = pncf.calcPoly(i, result);
|
|
|
|
+ b.add(curve);
|
|
|
|
+ }
|
|
|
|
+ return b;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 光伏绩效榜
|
|
|
|
+ *
|
|
|
|
+ * @param startdate
|
|
|
|
+ * @param enddate
|
|
|
|
+ */
|
|
|
|
+ public List<FjjxbVo> getPhotovoltaicPerformanceList(long startdate, long enddate) {
|
|
|
|
+ int oneday = 24 * 60 * 60;
|
|
|
|
+
|
|
|
|
+ String bzcldPath = config.getFilePathPrepare() + "bzd\\标准点.csv";
|
|
|
|
+ List<PhotovoltaicInfo> bzclds = file2Info(bzcldPath, true);
|
|
|
|
+ Map<String, PhotovoltaicInfo> bzcldMap = bzclds.stream().collect(Collectors.toMap(PhotovoltaicInfo::getInverter, Function.identity()));
|
|
|
|
+
|
|
|
|
+ //获取实际发电量
|
|
|
|
+ List<Windpowerstationtestingpoint2> rfdl = windpowerstationtestingpoint2Service.getPoints(null, "RFDL");
|
|
|
|
+ List<FjjxbVo> infos = new ArrayList<>();
|
|
|
|
+ //遍历逆变器
|
|
|
|
+ for (Windpowerstationtestingpoint2 wstp : rfdl) {
|
|
|
|
+ //场站
|
|
|
|
+ String stationid = wstp.getWindpowerstationid();
|
|
|
|
+
|
|
|
|
+ List<TsDoubleData> history = adpClient.getHistorySnap(wstp.getCode(), startdate + oneday * 1000, enddate, oneday);
|
|
|
|
+ double d = 0;
|
|
|
|
+ for (TsDoubleData data : history) {
|
|
|
|
+ d += data.getDoubleValue();
|
|
|
|
+ }
|
|
|
|
+ FjjxbVo vo = new FjjxbVo();
|
|
|
|
+ vo.setName(InitialRunner.gfstationMap.get(stationid));
|
|
|
|
+ vo.setSjfdl(d);
|
|
|
|
+
|
|
|
|
+ //理论发电量
|
|
|
|
+ double llfdl = 0;
|
|
|
|
+ //光照平均值
|
|
|
|
+ double gz = 0;
|
|
|
|
+ int i = 0;
|
|
|
|
+ double t = 5 / 60;
|
|
|
|
+
|
|
|
|
+ List<List<PhotovoltaicInfo>> datas = getDatas(stationid, startdate, enddate);
|
|
|
|
+ //遍历逆变器
|
|
|
|
+ for (List<PhotovoltaicInfo> data : datas) {
|
|
|
|
+
|
|
|
|
+ if ("HZJ_GDC".equals(stationid) || "AK_GDC".equals(stationid)) {
|
|
|
|
+ CurrentVoltageCalc.CalcTheoryPowerHZJ(data, bzcldMap);
|
|
|
|
+ } else {
|
|
|
|
+ CurrentVoltageCalc.CalcTheoryPower(data, bzcldMap);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (PhotovoltaicInfo datum : data) {
|
|
|
|
+ llfdl += datum.getIdeaP() * t;
|
|
|
|
+ gz += datum.getS();
|
|
|
|
+ i++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ vo.setLlfdl(llfdl);
|
|
|
|
+ vo.setSpeed(gz / i);
|
|
|
|
+ vo.setFnlly(vo.getSjfdl() / vo.getLlfdl() * 100);
|
|
|
|
+ infos.add(vo);
|
|
|
|
+ }
|
|
|
|
+ return infos;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取数据
|
|
|
|
+ *
|
|
|
|
+ * @return 逆变器,列表
|
|
|
|
+ */
|
|
|
|
+ public List<List<PhotovoltaicInfo>> getDatas(String stationid, long start, long end) {
|
|
|
|
+
|
|
|
|
+ //间隔
|
|
|
|
+ int interval = 5 * 60;
|
|
|
|
+ //获得测点
|
|
|
|
+ Map<String, String> zglpoints = getPoints(stationid, "zgl");
|
|
|
|
+ Map<String, String> adypoints = getPoints(stationid, "ady");
|
|
|
|
+ Map<String, String> bdypoints = getPoints(stationid, "bdy");
|
|
|
|
+ Map<String, String> cdypoints = getPoints(stationid, "cdy");
|
|
|
|
+ Map<String, String> adlpoints = getPoints(stationid, "adl");
|
|
|
|
+ Map<String, String> bdlpoints = getPoints(stationid, "bdl");
|
|
|
|
+ Map<String, String> cdlpoints = getPoints(stationid, "cdl");
|
|
|
|
+ Windpowerstationtestingpoint2 zfsPoint = InitialRunner.zfsMap.get(stationid);
|
|
|
|
+ Windpowerstationtestingpoint2 zjwdPoint = InitialRunner.zjwdMap.get(stationid);
|
|
|
|
+
|
|
|
|
+ //总辐射
|
|
|
|
+ List<TsDoubleData> zfsDatas = adpClient.getHistorySnap(zfsPoint.getCode(), start, end, interval);
|
|
|
|
+ //组件温度
|
|
|
|
+ List<TsDoubleData> zjwdDatas = adpClient.getHistorySnap(zjwdPoint.getCode(), start, end, interval);
|
|
|
|
+
|
|
|
|
+ List<List<PhotovoltaicInfo>> infosLit = new ArrayList<>();
|
|
|
|
+ //按逆变器
|
|
|
|
+ for (String wtid : zglpoints.keySet()) {
|
|
|
|
+
|
|
|
|
+ //总功率
|
|
|
|
+ List<TsDoubleData> zglDatas = adpClient.getHistorySnap(zglpoints.get(wtid), start, end, interval);
|
|
|
|
+
|
|
|
|
+ //电网A相电压
|
|
|
|
+ List<TsDoubleData> adyDatas = adpClient.getHistorySnap(adypoints.get(wtid), start, end, interval);
|
|
|
|
+ //电网A相电流
|
|
|
|
+ List<TsDoubleData> adlDatas = adpClient.getHistorySnap(adlpoints.get(wtid), start, end, interval);
|
|
|
|
+
|
|
|
|
+ List<PhotovoltaicInfo> infos = new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ List<TsDoubleData> bdyDatas = null, cdyDatas = null, bdlDatas = null, cdlDatas = null;
|
|
|
|
+ if ("HZJ_GDC".equals(stationid) || "AK_GDC".equals(stationid)) {
|
|
|
|
+ //电网B相电压
|
|
|
|
+ bdyDatas = adpClient.getHistorySnap(bdypoints.get(wtid), start, end, interval);
|
|
|
|
+ //电网C相电压
|
|
|
|
+ cdyDatas = adpClient.getHistorySnap(cdypoints.get(wtid), start, end, interval);
|
|
|
|
+ //电网B相电流
|
|
|
|
+ bdlDatas = adpClient.getHistorySnap(bdlpoints.get(wtid), start, end, interval);
|
|
|
|
+ //电网C相电流
|
|
|
|
+ cdlDatas = adpClient.getHistorySnap(cdlpoints.get(wtid), start, end, interval);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (int j = 0; j < zfsDatas.size(); j++) {
|
|
|
|
+ PhotovoltaicInfo info = new PhotovoltaicInfo();
|
|
|
|
+ info.setStation(stationid);
|
|
|
|
+ info.setInverter(wtid);
|
|
|
|
+ long ts = zfsDatas.get(j).getTs();
|
|
|
|
+ info.setTime(ts);
|
|
|
|
+ info.setDatetime(DateUtils.date2StringL(new Date(ts)));
|
|
|
|
+
|
|
|
|
+ info.setT(double3Decimal(zjwdDatas.get(j).getDoubleValue()));
|
|
|
|
+ info.setS(double3Decimal(zfsDatas.get(j).getDoubleValue(), false));
|
|
|
|
+ if ("HZJ_GDC".equals(stationid) || "AK_GDC".equals(stationid)) {
|
|
|
|
+ info.setAI(double3Decimal(adlDatas.get(j).getDoubleValue(), false));
|
|
|
|
+ info.setBI(double3Decimal(bdlDatas.get(j).getDoubleValue(), false));
|
|
|
|
+ info.setCI(double3Decimal(cdlDatas.get(j).getDoubleValue(), false));
|
|
|
|
+ info.setAV(double3Decimal(adyDatas.get(j).getDoubleValue(), true));
|
|
|
|
+ info.setBV(double3Decimal(bdyDatas.get(j).getDoubleValue(), true));
|
|
|
|
+ info.setCV(double3Decimal(cdyDatas.get(j).getDoubleValue(), true));
|
|
|
|
+ } else {
|
|
|
|
+ info.setI(double3Decimal(adlDatas.get(j).getDoubleValue(), false));
|
|
|
|
+ info.setV(double3Decimal(adyDatas.get(j).getDoubleValue(), true));
|
|
|
|
+ }
|
|
|
|
+ info.setActualP(double3Decimal(zglDatas.get(j).getDoubleValue(), false));
|
|
|
|
+ infos.add(info);
|
|
|
|
+ }
|
|
|
|
+ infosLit.add(infos);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return infosLit;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private double double3Decimal(double d) {
|
|
|
|
+ BigDecimal bd = new BigDecimal(d);
|
|
|
|
+ return bd.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private double double3Decimal(double d, boolean isMultFactor) {
|
|
|
|
+ d = d < 1 ? 0 : d;
|
|
|
|
+ if (isMultFactor) {
|
|
|
|
+ d = d * 0.001;
|
|
|
|
+ }
|
|
|
|
+ return double3Decimal(d);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获得测点
|
|
|
|
+ * 逆变器,测点
|
|
|
|
+ */
|
|
|
|
+ private Map<String, String> getPoints(String stationid, String key) {
|
|
|
|
+
|
|
|
|
+ switch (key) {
|
|
|
|
+ case "zgl":
|
|
|
|
+ //总功率
|
|
|
|
+ return InitialRunner.zglMap.get(stationid).stream().collect(Collectors.toMap(Windturbinetestingpointai2::getWindturbineid, Windturbinetestingpointai2::getCode));
|
|
|
|
+ case "ady":
|
|
|
|
+ List<Windturbinetestingpointai2> adyPoints = null;
|
|
|
|
+ if ("HZJ_GDC".equals(stationid)) {
|
|
|
|
+ //电网A相电压
|
|
|
|
+ adyPoints = windturbinetestingpointai2Service.getPoints(stationid, null, "AIG063");
|
|
|
|
+ } else {
|
|
|
|
+ //电网A相电压
|
|
|
|
+ adyPoints = windturbinetestingpointai2Service.getPoints(stationid, null, "AIG061");
|
|
|
|
+ }
|
|
|
|
+ return adyPoints.stream().collect(Collectors.toMap(Windturbinetestingpointai2::getWindturbineid, Windturbinetestingpointai2::getCode));
|
|
|
|
+ case "bdy":
|
|
|
|
+ List<Windturbinetestingpointai2> bdyPoints = windturbinetestingpointai2Service.getPoints(stationid, null, "AIG061A");
|
|
|
|
+ return bdyPoints.stream().collect(Collectors.toMap(Windturbinetestingpointai2::getWindturbineid, Windturbinetestingpointai2::getCode));
|
|
|
|
+ case "cdy":
|
|
|
|
+ List<Windturbinetestingpointai2> cdyPoints = windturbinetestingpointai2Service.getPoints(stationid, null, "AIG065");
|
|
|
|
+ return cdyPoints.stream().collect(Collectors.toMap(Windturbinetestingpointai2::getWindturbineid, Windturbinetestingpointai2::getCode));
|
|
|
|
+ case "adl":
|
|
|
|
+ List<Windturbinetestingpointai2> adlPoints = windturbinetestingpointai2Service.getPoints(stationid, null, "AIG060");
|
|
|
|
+ return adlPoints.stream().collect(Collectors.toMap(Windturbinetestingpointai2::getWindturbineid, Windturbinetestingpointai2::getCode));
|
|
|
|
+ case "bdl":
|
|
|
|
+ List<Windturbinetestingpointai2> bdlPoints = windturbinetestingpointai2Service.getPoints(stationid, null, "AIG062");
|
|
|
|
+ return bdlPoints.stream().collect(Collectors.toMap(Windturbinetestingpointai2::getWindturbineid, Windturbinetestingpointai2::getCode));
|
|
|
|
+ case "cdl":
|
|
|
|
+ List<Windturbinetestingpointai2> cdlPoints = windturbinetestingpointai2Service.getPoints(stationid, null, "AIG064");
|
|
|
|
+ return cdlPoints.stream().collect(Collectors.toMap(Windturbinetestingpointai2::getWindturbineid, Windturbinetestingpointai2::getCode));
|
|
|
|
+ }
|
|
|
|
+ return new HashMap<>();
|
|
|
|
+ }
|
|
|
|
+}
|