Sfoglia il codice sorgente

盒须图修改,盒须图所需单点偏差去掉绝对值

fanxiaoyu 5 mesi fa
parent
commit
44c3b1f22b

+ 29 - 4
cpp-admin/src/main/java/com/cpp/web/service/accuracy/impl/AccuracyPassRateServiceImpl.java

@@ -62,12 +62,12 @@ public class AccuracyPassRateServiceImpl extends ServiceImpl<AccuracyPassRateMap
         // 过滤掉单点平均偏差大于100的
         List<AccuracyPassRate> glList = list.stream().filter(f -> !"无可用数据计算".equals(f.getDeviationSum()) && !"无计算公式".equals(f.getDeviationSum())).collect(Collectors.toList());
         List<AccuracyPassRate> filterList = glList.stream().filter(f -> null != f.getDeviationSum() && Double.valueOf(f.getDeviationSum().replace("%","")) <=100 && !"无可用数据计算".equals(f.getDeviationSum()) && !"无计算公式".equals(f.getDeviationSum())).collect(Collectors.toList());
-        List<String> timeList = DateTimeUtil.getDatesInRange(startTime,endTime);
+        List<String> timeList = getDatesInRange(startTime,endTime);
         try {
             for (String s : timeList) {
-                if (s.equals(dateFormat.format(new Date()))){
-                    continue;
-                }
+//                if (s.equals(dateFormat.format(new Date()))){
+//                    continue;
+//                }
                 List<AccuracyPassRate> collectList = filterList.stream().filter(f -> dateFormat.format(f.getTime()).equals(s)).collect(Collectors.toList());
                 if (collectList.size() == 0 ){
                     AccuracyPassRate accuracyPassRate = new AccuracyPassRate();
@@ -266,4 +266,29 @@ public class AccuracyPassRateServiceImpl extends ServiceImpl<AccuracyPassRateMap
         endMap.put("monthData", Collections.singletonList(months));
         return endMap;
     }
+    public List<String> getDatesInRange(Date startTime, Date endTime) {
+        List<String> dateList = new ArrayList<>();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+
+        Calendar startCalendar = Calendar.getInstance();
+        Calendar endCalendar = Calendar.getInstance();
+        startCalendar.setTime(startTime);
+        endCalendar.setTime(endTime);
+
+        // 确保endCalendar包含endTime那一天(如果endTime不是那天的23:59:59)
+        endCalendar.set(Calendar.HOUR_OF_DAY, 23);
+        endCalendar.set(Calendar.MINUTE, 59);
+        endCalendar.set(Calendar.SECOND, 59);
+        endCalendar.set(Calendar.MILLISECOND, 999);
+
+        // 如果startTime和endTime在同一天,则只添加那一天
+        if (startCalendar.getTimeInMillis() <= endCalendar.getTimeInMillis()) {
+            do {
+                dateList.add(simpleDateFormat.format(startCalendar.getTime()));
+                startCalendar.add(Calendar.DAY_OF_MONTH, 1);
+            } while (startCalendar.getTimeInMillis() < endCalendar.getTimeInMillis());
+        }
+        return dateList;
+    }
+
 }

+ 4 - 1
cpp-admin/src/main/java/com/cpp/web/service/accuracy/impl/CalculateForecastPowerShortTermRegulationImpl.java

@@ -137,6 +137,9 @@ public class CalculateForecastPowerShortTermRegulationImpl implements CalculateI
                                     ForecastPowerShortTermRegulation forecastPowerShortTermRegulation = dateForecastListMap.get(finalTime).get(0);
                                     BigDecimal subtractAbs = powerStationStatusData.getRealValue().subtract(forecastPowerShortTermRegulation.getFpValue()).abs();
                                     BigDecimal value = subtractAbs.divide(electricField.getCapacity(), 4, BigDecimal.ROUND_DOWN);
+                                    // 盒须图所需 不带绝对值
+                                    BigDecimal subtract = powerStationStatusData.getRealValue().subtract(forecastPowerShortTermRegulation.getFpValue());
+                                    BigDecimal valueNoAbs = subtract.divide(electricField.getCapacity(), 4, BigDecimal.ROUND_DOWN);
                                     // 单点偏差
                                     ShortTermSinglePointDeviation shortTermSinglePointDeviation = new ShortTermSinglePointDeviation();
                                     shortTermSinglePointDeviation.setDeviation(value.multiply(new BigDecimal(100)));
@@ -144,7 +147,7 @@ public class CalculateForecastPowerShortTermRegulationImpl implements CalculateI
                                     shortTermSinglePointDeviation.setTime(finalTime);
                                     shortTermSinglePointDeviation.setForecastHowLongAgo(ago);
                                     shortTermSinglePointDeviationList.add(shortTermSinglePointDeviation);
-                                    values.add(value);
+                                    values.add(valueNoAbs);
                                 }
                             }
 

+ 38 - 11
cpp-admin/src/main/java/com/cpp/web/service/accuracy/impl/ShortTermSinglePointDeviationServiceImpl.java

@@ -46,7 +46,9 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
                 ));
 
         // 获取每一天,因为有没有数据都要展示出来
-        List<String> dateList = DateTimeUtil.getDatesInRange(startTime, endTime);
+        List<String> dateList = getDatesInRange(startTime, endTime);
+
+        Map<String, Object> map = new HashMap<>();
 
         List dataList = new ArrayList<>();
         List timeList = new ArrayList<>();
@@ -58,15 +60,18 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
                 // 转换为数组
                 double[] array = groupedByDate.get(s).stream().mapToDouble(Double::doubleValue).toArray();
                 // 所需盒须值
-                double[] result = plot(array);
+                Object[] result = plot(array,s);
                 dataList.add(result);
 
-                double max = result[result.length - 1];double min = result[0];
+                double q3 = (Double) result[3];
+                double q1 = (Double)result[1];
+
                 // 获取异常值
-                List<Double> doubleList = groupedByDate.get(s).stream().filter(f -> f < min && f > max).collect(Collectors.toList());
-                List ycDataList = new ArrayList<>();
+                List<Double> doubleList = groupedByDate.get(s).stream().filter(f -> f < q1 || f > q3).collect(Collectors.toList());
+
                 if (doubleList.size() > 0) {
                     for (Double v : doubleList) {
+                        List ycDataList = new ArrayList<>();
                         ycDataList.add(s);
                         ycDataList.add(v);
                         abnormalList.add(ycDataList);
@@ -76,17 +81,14 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
                 dataList.add("");
             }
         }
-
-        Map<String, Object> map = new HashMap<>();
         map.put("result", dataList);
         map.put("time", timeList);
         map.put("abnormal", abnormalList);
-
         return map;
     }
 
 
-    public static double[] plot(double[] data) {
+    public static Object[] plot(double[] data,String date) {
         Arrays.sort(data);
         // 1/4
         double q1 = calculateQuantile(data, 0.25);
@@ -99,11 +101,11 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
         double maxInRegion = q3 + 1.5 * iqr;
         //最小观测值
         double mixInRegion = q1 - 1.5 * iqr;
-        return new double[]{BigDecimal.valueOf(mixInRegion).setScale(2, RoundingMode.HALF_UP).doubleValue(),
+        return new Object[]{BigDecimal.valueOf(mixInRegion).setScale(2, RoundingMode.HALF_UP).doubleValue(),
                 BigDecimal.valueOf(q1).setScale(2, RoundingMode.HALF_UP).doubleValue(),
                 BigDecimal.valueOf(q2).setScale(2, RoundingMode.HALF_UP).doubleValue(),
                 BigDecimal.valueOf(q3).setScale(2, RoundingMode.HALF_UP).doubleValue(),
-                BigDecimal.valueOf(maxInRegion).setScale(2, RoundingMode.HALF_UP).doubleValue()};
+                BigDecimal.valueOf(maxInRegion).setScale(2, RoundingMode.HALF_UP).doubleValue(),date};
     }
 
     private static double calculateQuantile(double[] data, double percentile) {
@@ -119,6 +121,31 @@ public class ShortTermSinglePointDeviationServiceImpl extends ServiceImpl<ShortT
             return lowerValue + upperValue;
         }
     }
+    public List<String> getDatesInRange(Date startTime, Date endTime) {
+        List<String> dateList = new ArrayList<>();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+
+        Calendar startCalendar = Calendar.getInstance();
+        Calendar endCalendar = Calendar.getInstance();
+        startCalendar.setTime(startTime);
+        endCalendar.setTime(endTime);
+
+        // 确保endCalendar包含endTime那一天(如果endTime不是那天的23:59:59)
+        endCalendar.set(Calendar.HOUR_OF_DAY, 23);
+        endCalendar.set(Calendar.MINUTE, 59);
+        endCalendar.set(Calendar.SECOND, 59);
+        endCalendar.set(Calendar.MILLISECOND, 999);
+
+        // 如果startTime和endTime在同一天,则只添加那一天
+        if (startCalendar.getTimeInMillis() <= endCalendar.getTimeInMillis()) {
+            do {
+                dateList.add(simpleDateFormat.format(startCalendar.getTime()));
+                startCalendar.add(Calendar.DAY_OF_MONTH, 1);
+            } while (startCalendar.getTimeInMillis() < endCalendar.getTimeInMillis());
+        }
 
+        // 如果startTime在endTime之后(理论上不应该发生,除非输入有误),则不添加任何日期
 
+        return dateList;
+    }
 }

+ 32 - 9
cpp-ui/src/views/statistics/stationAccuracy/index.vue

@@ -171,7 +171,11 @@ export default {
       chartData: {
         boxplotData:[],
         scatterData:[],
-        xData:[]
+        xData:[],
+        q1:null,
+        q3:null,
+        min:null,
+        max:null
       }
     }
   },
@@ -282,7 +286,12 @@ export default {
         this.chartData.boxplotData = response.data.result
         this.chartData.scatterData = response.data.abnormal
         this.chartData.xData = response.data.time
+        this.chartData.q1 = response.data.q1
+        this.chartData.q3 = response.data.q3
+        this.chartData.min = response.data.min
+        this.chartData.max = response.data.max
         this.pcChart = echarts.init(document.getElementById('pcCharts'), 'dark')
+        console.log(this.chartData.boxplotData)
         this.setOptions(this.chartData)
         this.loading = false
       })
@@ -462,7 +471,7 @@ export default {
         _this.zqlChart.resize();
       });
     },
-    setOptions({xData, boxplotData,scatterData} = {}) {
+    setOptions({xData, boxplotData,scatterData,q1,q3,min,max} = {}) {
       const _this = this
       let option = {
         title: [
@@ -491,14 +500,14 @@ export default {
             let str = params[0].axisValue +'<br/>'
             for(let param of params){
               if(param.componentSubType === 'scatter'){
-                str = str + '<div class="flex justify-between"><div>'+param.marker+param.value[0]+'异常</div><div class="ml-0">'+param.value[1]+'</div></div>'
+                str = str + '<div class="flex justify-between"><div>'+param.marker+param.value[0]+'异常</div><div class="ml-0">'+param.value[1]+'</div></div>'
               }
               if(param.componentSubType === 'boxplot'){
-                str = str + '<div class="flex justify-between"><div>'+param.marker+'min</div><div >'+param.value[1]+'</div></div>'+
-                  '<div class="flex justify-between"><div>'+param.marker+'Q1</div><div>'+param.value[2]+'</div></div>'+
-                  '<div class="flex justify-between"><div>'+param.marker+'median</div><div>'+param.value[3]+'</div></div>'+
-                  '<div class="flex justify-between"><div>'+param.marker+'Q3</div><div>'+param.value[4]+'</div></div>'+
-                  '<div class="flex justify-between"><div>'+param.marker+'max</div><div>'+param.value[5]+'</div></div>'
+                str = str + '<div class="flex justify-between"><div>'+param.marker+'最小值</div><div >'+param.value[1]+'</div></div>'+
+                  '<div class="flex justify-between"><div>'+param.marker+'第一四分位数</div><div>'+param.value[2]+'</div></div>'+
+                  '<div class="flex justify-between"><div>'+param.marker+'中位数</div><div>'+param.value[3]+'</div></div>'+
+                  '<div class="flex justify-between"><div>'+param.marker+'第三四分位数</div><div>'+param.value[4]+'</div></div>'+
+                  '<div class="flex justify-between"><div>'+param.marker+'最大值</div><div>'+param.value[5]+'</div></div>'
               }
             }
             return str
@@ -548,8 +557,22 @@ export default {
           },
           {
             type: 'scatter',
+            symbolSize: 8,
             itemStyle: {
-              color: 'orange',
+              color: function (params) {
+                for (let i = 0; i < boxplotData.length; i++) {
+                  if (boxplotData[i].length>0&&boxplotData[i][5] == params.value[0]){
+                    var value = params.value[1];
+                    if ((value < boxplotData[i][1] && value > boxplotData[i][0] )|| (value >boxplotData[i][3] && value < boxplotData[i][4])) {
+                      return 'orange';
+                    }
+                    if (value  <boxplotData[i][0] || value > boxplotData[i][4]) {
+                      return 'red';
+                    }
+                  }
+                }
+
+              }
             },
             data: scatterData
           }