From 542edd3465d8394822b22a2d10806267f1ac79b1 Mon Sep 17 00:00:00 2001
From: cjl <276999030@qq.com>
Date: Mon, 24 Jul 2023 13:28:53 +0800
Subject: [PATCH] fix: 导出数据添加百分位

---
 screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java |   53 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java
index 27bd715..cd82a74 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java
@@ -266,7 +266,7 @@
                         if(map.containsKey(k)){
                             Object o = map.get(k).get(sensor);
                             timeValueMap.put(c,Objects.nonNull(o)?Double.valueOf(o.toString()):0);
-                            if(Objects.nonNull(o)){
+                            if(Objects.nonNull(o)&& (!Double.valueOf(o.toString()).equals(0d))){
                                 doubleArrayList.add(Double.valueOf(o.toString()));
                             }
                         }else {
@@ -378,10 +378,15 @@
             for (Device device:devices) {
                 Date ks = DateUtils.getDate(startTime,"yyyy-MM-dd");
                 Date js = DateUtils.getDateOfDay(DateUtils.getDate(endTime,"yyyy-MM-dd"),1);
+                String nameSite = pointMap.get(device.getMonitorPointId());
+                String name = device.getName();
+                Map<String, Object> timeValueMap = new LinkedHashMap<>();
+                Map<String,ArrayList<Double>> listMap = new HashMap<>();
+                int numCount = 0;
                 while (DateUtils.isTimeBefor(js,ks)){
-                    Map<String, Object> timeValueMap = new LinkedHashMap<>();//key���time���value������������json
-                    timeValueMap.put("������������",pointMap.get(device.getMonitorPointId()));
-                    timeValueMap.put("name",device.getName());
+                    timeValueMap = new LinkedHashMap<>();//key���time���value������������json
+                    timeValueMap.put("������������",nameSite);
+                    timeValueMap.put("name",name);
                     String c = DateUtils.dateToDateString(ks,"yyyy-MM-dd");
                     timeValueMap.put("������",c);
                     for (String sensor:sensorsList) {
@@ -390,12 +395,40 @@
                         if(map.containsKey(k)){
                             Object o = map.get(k).get(sensor);
                             num = Objects.nonNull(o)?Double.valueOf(o.toString()):0d;
+                            if(Objects.nonNull(num)&& !num.equals(0d)){
+                                ArrayList<Double> doubleArrayList = Objects.isNull(listMap.get(numCount+"_"+sensorMap.get(sensor)))?new ArrayList<>():listMap.get(numCount+"_"+sensorMap.get(sensor));
+                                doubleArrayList.add(num);
+                                listMap.put(numCount+"_"+sensorMap.get(sensor),doubleArrayList);
+                            }
                         }
                         timeValueMap.put(sensorMap.get(sensor),num);
                     }
                      resultList.add(timeValueMap);
                      ks = DateUtils.getDateOfDay(ks,1);
                 }
+                timeValueMap = new LinkedHashMap<>();
+                timeValueMap.put("������������",nameSite);
+                timeValueMap.put("name",name);
+                timeValueMap.put("������","���������");
+                for(int z = 0 ;z< sensorsList.size();z++){
+                    double rsAvg = 0L;
+                    String son = numCount+"_"+sensorMap.get(sensorsList.get(z));
+                    if(listMap.containsKey(numCount+"_"+sensorMap.get(sensorsList.get(z)))){
+                        if(son.contains("������")){
+                            rsAvg = percentile(listMap.get(numCount+"_"+sensorMap.get(sensorsList.get(z))),90d);
+
+                        }else if(son.contains("������������")){
+                            rsAvg = percentile(listMap.get(numCount+"_"+sensorMap.get(sensorsList.get(z))),95d);
+                        }else {
+                            Double ListAvg = listMap.get(numCount+"_"+sensorMap.get(sensorsList.get(z))).stream().collect(Collectors.averagingDouble(Double::doubleValue));
+                            rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
+                        }
+
+                    }
+                    timeValueMap.put(sensorMap.get(sensorsList.get(z)),rsAvg);
+                }
+                resultList.add(timeValueMap);
+                numCount++;
             }
 
         }else {
@@ -501,6 +534,18 @@
         monitorPointMapper.selectList(monitorPointQueryWrapper).forEach(it->map.put(it.getId(),it.getName()));
         return map;
     }
+    private Double percentile(List<Double> date,double num){
+        Collections.sort(date);
+        double position = (num / 100) * (date.size() - 1);
+        int index = (int) position;
+        // ���������������������������������
+        double fraction = position - index;
+
+        // ������������������
+        double percentileValue = date.get(index) + fraction * (date.get(index + 1) - date.get(index));
+        return new BigDecimal(percentileValue).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
 }
 
 

--
Gitblit v1.8.0