|
@@ -324,42 +324,43 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
Double v = CalcCache.fitcoef.get(tbId).get(fsList.get(i).getValue());
|
|
|
if (v == null) v = 0.0;
|
|
|
v = v - glList.get(i).getValue();
|
|
|
+ double v2 = v > 0 ? v : 0;
|
|
|
switch ((int) collectZt.get(i).getValue()) {
|
|
|
//计划检修损失:
|
|
|
case 6:
|
|
|
//检修
|
|
|
- jxss += v;
|
|
|
+ jxss += v2;
|
|
|
break;
|
|
|
case 1:
|
|
|
//手动停机
|
|
|
- sdtj += v;
|
|
|
+ sdtj += v2;
|
|
|
break;
|
|
|
//非计划检修损失:
|
|
|
case 4:
|
|
|
//故障
|
|
|
- gzss += v;
|
|
|
+ gzss += v2;
|
|
|
break;
|
|
|
case 0:
|
|
|
//待机
|
|
|
- djss += v;
|
|
|
+ djss += v2;
|
|
|
break;
|
|
|
//性能损失:
|
|
|
case 2:
|
|
|
//性能
|
|
|
- xnss += v;
|
|
|
+ xnss += v2;
|
|
|
break;
|
|
|
case 3:
|
|
|
//发电降出力
|
|
|
- fdjcl += v;
|
|
|
+ fdjcl += v2;
|
|
|
break;
|
|
|
//限电损失:
|
|
|
case 8:
|
|
|
//限电降出力
|
|
|
- xdjcl += v;
|
|
|
+ xdjcl += v2;
|
|
|
break;
|
|
|
case 9:
|
|
|
//限电停机
|
|
|
- xdtj += v;
|
|
|
+ xdtj += v2;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -3257,7 +3258,9 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
|
|
|
for (PointInfo info : entityMxzt) {
|
|
|
TurbineInfoDay infoDay = byDate.get(info.getTurbineId());
|
|
|
- Map<Double, Long> durations = calculateStateDurations(info.getPointDatas());
|
|
|
+ Map<String, Map<Double, Long>> dlmm = calcStateDurationFrequency(info.getPointDatas());
|
|
|
+ Map<Double, Long> durations = dlmm.get("duration");
|
|
|
+ Map<Double, Long> frequency = dlmm.get("frequency");
|
|
|
infoDay.setDjMin(durations.getOrDefault(0.0, 0L) / 60000.0);
|
|
|
infoDay.setTjMin(durations.getOrDefault(1.0, 0L) / 60000.0);
|
|
|
infoDay.setYxMin(durations.getOrDefault(2.0, 0L) / 60000.0);
|
|
@@ -3269,6 +3272,40 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
turbineInfoDayService.saveOrUpdateBatch(byDate.values());
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public Map<String, Map<Double, Long>> calcStateDurationFrequency(List<PointData> datas) {
|
|
|
+ if (CollUtil.isEmpty(datas)) return Collections.emptyMap();
|
|
|
+
|
|
|
+ Map<Double, Long> durations = new HashMap<>();
|
|
|
+ Map<Double, Long> frequency = new HashMap<>();
|
|
|
+ Map<String, Map<Double, Long>> dlmm = new HashMap<>();
|
|
|
+ double prevState = datas.get(0).getValue(); // 初始状态
|
|
|
+ long prevTs = datas.get(0).getTs(); // 初始时间戳
|
|
|
+
|
|
|
+ PointData current;
|
|
|
+ double currentState;
|
|
|
+ long currentTs;
|
|
|
+ for (int i = 1; i < datas.size(); i++) {
|
|
|
+ current = datas.get(i);
|
|
|
+ currentState = current.getValue();
|
|
|
+ currentTs = current.getTs();
|
|
|
+
|
|
|
+ if (currentState != prevState) {
|
|
|
+ // 当状态变化时,计算前一个状态的持续时间并更新map
|
|
|
+ durations.put(prevState, durations.getOrDefault(prevState, 0L) + (currentTs - prevTs));
|
|
|
+ frequency.put(prevState, frequency.getOrDefault(prevState, 0L) + 1);
|
|
|
+ prevState = currentState;
|
|
|
+ prevTs = currentTs;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 不要忘记计算列表中最后一个状态的持续时间(如果列表没有以状态变化结束)
|
|
|
+ durations.put(prevState, durations.getOrDefault(prevState, 0L) + (datas.get(datas.size() - 1).getTs() - prevTs));
|
|
|
+
|
|
|
+ dlmm.put("duration", durations);
|
|
|
+ dlmm.put("frequency", frequency);
|
|
|
+ return dlmm;
|
|
|
+ }
|
|
|
+
|
|
|
public Map<Double, Long> calculateStateDurations(List<PointData> datas) {
|
|
|
if (CollUtil.isEmpty(datas)) return Collections.emptyMap();
|
|
|
|
|
@@ -3299,7 +3336,7 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
public void getRawDataByEntity(List<PointInfo> entity, URI uri, Date start, Date end) {
|
|
|
for (PointInfo info : entity) {
|
|
|
List<PointData> snap = adapter.getHistoryRaw(uri, info.getPointKey(), start.getTime(), end.getTime());
|
|
|
-// ThreadUtil.sleep(5);
|
|
|
+ // ThreadUtil.sleep(5);
|
|
|
info.setPointDatas(snap);
|
|
|
}
|
|
|
}
|
|
@@ -3427,7 +3464,7 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
info1.setPointDatas(Collections.singletonList(data1));
|
|
|
result.add(info1);
|
|
|
} else {
|
|
|
-// Map<String, PointData> latest2 = adapter.getLatest(goldenUri(), collect);
|
|
|
+ // Map<String, PointData> latest2 = adapter.getLatest(goldenUri(), collect);
|
|
|
data1.setDoubleValue(2.0);
|
|
|
System.out.println("wtId: " + wtId + ",状态值无批配: " + data1.getValue());
|
|
|
info1.setPointDatas(Collections.singletonList(data1));
|
|
@@ -4249,12 +4286,12 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
Map<Double, Long> map = calcSectionStationZtts(end, stId);
|
|
|
for (StationInfoMin day : byDate) {
|
|
|
String id = day.getStationId();
|
|
|
-// if (day.getPjfs() == null || day.getPjfs() == 0) {
|
|
|
+ // if (day.getPjfs() == null || day.getPjfs() == 0) {
|
|
|
List<PointInfo> fsInfos = fssMap.get(id);
|
|
|
double pjfs = fsInfos.stream().mapToDouble(pi -> pi.getPointDatas().stream().mapToDouble(PointData::getValue).average().orElse(0.0)).average().orElse(0);
|
|
|
day.setPjfs(pjfs);
|
|
|
-// }
|
|
|
-// if (day.getPjgl() == null || day.getPjgl() == 0) {
|
|
|
+ // }
|
|
|
+ // if (day.getPjgl() == null || day.getPjgl() == 0) {
|
|
|
PointInfo cxInfo = statMapCx.get(id);
|
|
|
double cxgl = cxInfo.getPointDatas().stream().mapToDouble(PointData::getValue).average().orElse(0.0);
|
|
|
cxgl = cxgl * cxInfo.getCoef();
|
|
@@ -4263,19 +4300,19 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
if (cxgl > 169600 && day.getPjfs() < 3) cxgl = 0;
|
|
|
if (cxgl > 169600 && day.getPjfs() > 3) cxgl = nihe(day.getPjfs());
|
|
|
day.setPjgl(cxgl);
|
|
|
-// }
|
|
|
-// if (day.getAgc() == null || day.getAgc() == 0) {
|
|
|
+ // }
|
|
|
+ // if (day.getAgc() == null || day.getAgc() == 0) {
|
|
|
PointInfo agcInfo = mapAgc.get(id);
|
|
|
double agc = agcInfo.getPointDatas().get(0).getValue() * agcInfo.getCoef();
|
|
|
if (agc < day.getPjgl()) agc = day.getPjgl();
|
|
|
day.setAgc(agc);
|
|
|
-// }
|
|
|
-// if (day.getRfdl() == null || day.getRfdl() == 0) {
|
|
|
+ // }
|
|
|
+ // if (day.getRfdl() == null || day.getRfdl() == 0) {
|
|
|
List<PointInfo> fdlInfos = fdlsMap.get(id);
|
|
|
double rfdl = fdlInfos.stream().mapToDouble(pi -> {
|
|
|
double v = (pi.getPointDatas().get(1).getValue() - pi.getPointDatas().get(0).getValue()) * pi.getCoef();
|
|
|
if (v < 0) v = 0;
|
|
|
-// if (v > 10500) v = 10500.0;
|
|
|
+ // if (v > 10500) v = 10500.0;
|
|
|
return v;
|
|
|
}).sum();
|
|
|
if ((rfdl < 660 && day.getPjgl() > 0) || rfdl >= 45500) rfdl = day.getPjgl() / 4.0;
|
|
@@ -4287,12 +4324,12 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
if (day.getAgc() == 170000 && rfdl != 42400.0) {
|
|
|
day.setAgc(rfdl * 4);
|
|
|
}
|
|
|
-// }
|
|
|
-// if (day.getHjwd() == null || day.getHjwd() == 0) {
|
|
|
+ // }
|
|
|
+ // if (day.getHjwd() == null || day.getHjwd() == 0) {
|
|
|
List<PointInfo> hjwdInfos = hjwdsMap.get(id);
|
|
|
double hjwd = hjwdInfos.stream().mapToDouble(pi -> pi.getPointDatas().stream().mapToDouble(PointData::getValue).average().orElse(0.0)).average().orElse(0);
|
|
|
day.setHjwd(hjwd);
|
|
|
-// }
|
|
|
+ // }
|
|
|
//0 待机-,1 停机,2 发电-,4 故障-,6 检修,8 限电,12 离线
|
|
|
day.setDjts(map.get(0.0));
|
|
|
day.setYxts(map.get(2.0));
|
|
@@ -4301,6 +4338,7 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
}
|
|
|
stationInfoMinService.saveOrUpdateBatch(byDate);
|
|
|
}
|
|
|
+
|
|
|
public StationInfoMin calcStationSjglAgcPjfsHjwdDlMin2(Date begin, Date end, String stId) {
|
|
|
//AGC
|
|
|
List<PointInfo> entityAgc = getEntity("AGC002", "booster");
|
|
@@ -4373,11 +4411,11 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
|
|
|
private double nihe(double pjfs) {
|
|
|
//LJS
|
|
|
-// if (pjfs > 13) return 94251.0;
|
|
|
-// return -90.4382 * Math.pow(pjfs, 3) + 1661.275 * Math.pow(pjfs, 2) + 2245.86 * pjfs - 17011.14;
|
|
|
+ // if (pjfs > 13) return 94251.0;
|
|
|
+ // return -90.4382 * Math.pow(pjfs, 3) + 1661.275 * Math.pow(pjfs, 2) + 2245.86 * pjfs - 17011.14;
|
|
|
//FSG
|
|
|
if (pjfs > 8.62) return 35880.0;
|
|
|
- return -286.3119 * Math.pow(pjfs, 3) + 4837.637 * Math.pow(pjfs, 2) -19121.73 * pjfs + 24636.96;
|
|
|
+ return -286.3119 * Math.pow(pjfs, 3) + 4837.637 * Math.pow(pjfs, 2) - 19121.73 * pjfs + 24636.96;
|
|
|
}
|
|
|
|
|
|
public void getPoint() {
|
|
@@ -4406,34 +4444,27 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
List<PointInfo> entity1 = getEntity("AI422", "state");
|
|
|
entity.addAll(entity1);
|
|
|
Map<String, EquipmentModel> map = equipmentModelService.map();
|
|
|
-
|
|
|
+ //风机id,风机装机容量
|
|
|
Map<String, Double> tbPowerMap = entity.stream().collect(Collectors.toMap(pi -> pi.getTurbineId(), pi -> map.get(pi.getSpare()).getPowerProduction()));
|
|
|
+ //实际功率
|
|
|
List<PointInfo> entityGl = getEntity("AI114", "turbine");
|
|
|
getSnapDataByEntity(entityGl, begin, end, 15 * 60);
|
|
|
Map<String, PointInfo> glpisMap = entityGl.stream().collect(Collectors.toMap(PointInfo::getTurbineId, Function.identity()));
|
|
|
- QueryWrapper<HistoryPredict> predictWrapper = new QueryWrapper<>();
|
|
|
- predictWrapper.lambda().eq(HistoryPredict::getPredictType, "CDQ").eq(HistoryPredict::getDataTime, begin)
|
|
|
- .orderByAsc(HistoryPredict::getDataTime);
|
|
|
- List<HistoryPredict> predictList = historyPredictService.list(predictWrapper);
|
|
|
- Map<String, List<HistoryPredict>> predictsMap = predictList.stream().collect(Collectors.groupingBy(HistoryPredict::getTurbineId));
|
|
|
+ //短期 predictType + "_" + modelId + "_" + sstId + t
|
|
|
+ QueryWrapper<HistoryPredict> dqWrapper = new QueryWrapper<>();
|
|
|
+ dqWrapper.eq("device_type", "station").eq("predict_type", "DQ").eq("data_time", begin)
|
|
|
+ .between("predict_time", begin, end).orderByAsc("data_time");
|
|
|
+ List<HistoryPredict> dqList = historyPredictService.list(dqWrapper);
|
|
|
+ Map<String, List<HistoryPredict>> dqMap = dqList.stream().collect(Collectors.groupingBy(HistoryPredict::getSiteId));
|
|
|
//超短期
|
|
|
- List<HistoryPredict> cdqPredicts = new ArrayList<>();
|
|
|
- predictsMap.forEach((stId, hps) -> {
|
|
|
- cdqPredicts.addAll(hps.subList(0, 16));
|
|
|
- });
|
|
|
- for (int i = 1; i < 6; i++) {
|
|
|
- DateTime hour = DateUtil.offsetHour(begin, 4 * i);
|
|
|
- DateTime hour2 = DateUtil.offsetHour(hour, 4);
|
|
|
- QueryWrapper<HistoryPredict> wrapper = new QueryWrapper<>();
|
|
|
- wrapper.lambda().eq(HistoryPredict::getPredictType, "CDQ").eq(HistoryPredict::getDataTime, hour)
|
|
|
- .between(HistoryPredict::getPredictTime, hour, hour2).orderByAsc(HistoryPredict::getPredictTime);
|
|
|
- List<HistoryPredict> predicts = historyPredictService.list(wrapper);
|
|
|
- cdqPredicts.addAll(predicts);
|
|
|
- }
|
|
|
- Map<String, List<HistoryPredict>> cdqPredictsMap = cdqPredicts.stream().collect(Collectors.groupingBy(HistoryPredict::getTurbineId));
|
|
|
+ QueryWrapper<HistoryPredict> cdqWrapper = new QueryWrapper<>();
|
|
|
+ cdqWrapper.eq("device_type", "station").eq("predict_type", "CDQ").eq("data_time", begin).orderByAsc("data_time");
|
|
|
+ List<HistoryPredict> cdqList = historyPredictService.list(cdqWrapper);
|
|
|
+ Map<String, List<HistoryPredict>> cdqMap = cdqList.stream().collect(Collectors.groupingBy(HistoryPredict::getSiteId));
|
|
|
|
|
|
List<PredictExamin> peList = new ArrayList<>();
|
|
|
- predictsMap.forEach((stId, hps) -> {
|
|
|
+ dqMap.forEach((stId, hps) -> {
|
|
|
+ //短期
|
|
|
List<Double> predictPower = hps.stream().map(HistoryPredict::getPredictPower).collect(Collectors.toList());
|
|
|
List<Double> actualPower = glpisMap.get(stId).getPointDatas().stream().map(PointData::getValue).collect(Collectors.toList());
|
|
|
Double installCapacity = tbPowerMap.get(stId);
|
|
@@ -4444,23 +4475,17 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
examin.setDeviceType(predict.getDeviceType());
|
|
|
examin.setTime(begin);
|
|
|
examin.setSiteId(predict.getSiteId());
|
|
|
- examin.setPeriodId(predict.getPeriodId());
|
|
|
- examin.setLineId(predict.getLineId());
|
|
|
- examin.setTurbineId(predict.getTurbineId());
|
|
|
examin.setExaminScore(calcExaminScore(predictPower, actualPower, installCapacity));
|
|
|
examin.setAccuracyRate(calcAccuracyRate(predictPower, actualPower, installCapacity));
|
|
|
peList.add(examin);
|
|
|
//超短期
|
|
|
- List<Double> predictPowerCdq = cdqPredictsMap.get(stId).stream().map(HistoryPredict::getPredictPower).collect(Collectors.toList());
|
|
|
+ List<Double> predictPowerCdq = cdqMap.get(stId).stream().map(HistoryPredict::getPredictPower).collect(Collectors.toList());
|
|
|
PredictExamin e = new PredictExamin();
|
|
|
e.setModelId(predict.getModelId());
|
|
|
e.setPredictType("CDQ");
|
|
|
e.setDeviceType(predict.getDeviceType());
|
|
|
e.setTime(begin);
|
|
|
e.setSiteId(predict.getSiteId());
|
|
|
- e.setPeriodId(predict.getPeriodId());
|
|
|
- e.setLineId(predict.getLineId());
|
|
|
- e.setTurbineId(predict.getTurbineId());
|
|
|
e.setExaminScore(calcExaminScore(predictPowerCdq, actualPower, installCapacity));
|
|
|
e.setAccuracyRate(calcAccuracyRate(predictPowerCdq, actualPower, installCapacity));
|
|
|
peList.add(e);
|
|
@@ -4479,7 +4504,7 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
public double calcExaminScore(List<Double> predictPower, List<Double> actualPower, Double installCapacity) {
|
|
|
if (CollUtil.isEmpty(predictPower) || CollUtil.isEmpty(actualPower) || installCapacity == null) return 0;
|
|
|
int n = predictPower.size();
|
|
|
- if (n != actualPower.size()) return 0;
|
|
|
+ if (actualPower.size() < n) return 0;
|
|
|
double maxErrorPercentage = 0.0;
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
double errorPercentage = 0.0;
|
|
@@ -4510,7 +4535,7 @@ public class JavaFunctionJobHandler extends IJobHandler {
|
|
|
public double calcAccuracyRate(List<Double> predictPower, List<Double> actualPower, Double installCapacity) {
|
|
|
if (CollUtil.isEmpty(predictPower) || CollUtil.isEmpty(actualPower) || installCapacity == null) return 0;
|
|
|
int n = predictPower.size();
|
|
|
- if (n != actualPower.size()) return 0;
|
|
|
+ if (actualPower.size() < n) return 0;
|
|
|
double totalError = 0.0;
|
|
|
int validPoints = 0;
|
|
|
for (int i = 0; i < n; i++) {
|