Browse Source

五损计算修改

xushili 4 months ago
parent
commit
4efae4cb14

+ 80 - 55
ruoyi-admin/src/main/java/com/ruoyi/web/controller/JavaFunctionJobHandler.java

@@ -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++) {

+ 1 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/PredictController.java

@@ -605,6 +605,7 @@ public class PredictController {
                     rp.setPredictPower(glycsj.getPower());
                     rp.setPredictEnergy(glycsj.getEnergy());
                     rpList.add(rp);
+                    if(predictType.equals("ZCQ")) continue;
                     HistoryPredict hp = new HistoryPredict();
                     hp.setModelId(modelId);
                     hp.setPredictType(predictType);