From fdc8e1e781851904b05f234523f372c8c1098b69 Mon Sep 17 00:00:00 2001
From: jinpengyong <jpy123456>
Date: Thu, 01 Jul 2021 11:42:45 +0800
Subject: [PATCH] 定时任务CO.O3算法

---
 screen-common/src/main/java/com/moral/util/DateUtils.java                               |    8 
 screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java |   28 ++
 screen-common/src/main/java/com/moral/constant/KafkaConstants.java                      |   11 
 screen-job/src/main/resources/mapper/HistoryWeeklyMapper.xml                            |   20 ++
 screen-job/src/main/java/com/moral/api/service/impl/HistoryWeeklyServiceImpl.java       |  147 ++++++++++++++
 screen-job/src/main/java/com/moral/api/service/HistoryWeeklyService.java                |   18 +
 screen-job/src/main/java/com/moral/api/mapper/HistoryWeeklyMapper.java                  |   21 ++
 screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java             |    6 
 screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java        |   57 ++---
 screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java                 |   26 +
 screen-job/src/main/java/com/moral/api/entity/HistoryWeekly.java                        |   44 ++++
 screen-common/src/main/java/com/moral/constant/Constants.java                           |   13 +
 screen-common/src/main/java/com/moral/util/AmendUtils.java                              |  168 ++++++++++++++++
 13 files changed, 511 insertions(+), 56 deletions(-)

diff --git a/screen-common/src/main/java/com/moral/constant/Constants.java b/screen-common/src/main/java/com/moral/constant/Constants.java
index 75ce9a3..d20f4af 100644
--- a/screen-common/src/main/java/com/moral/constant/Constants.java
+++ b/screen-common/src/main/java/com/moral/constant/Constants.java
@@ -139,5 +139,18 @@
      * */
     public static final String SENSOR_CODE_TEMP = "a01001";
 
+    /*
+     * ������code
+     * */
+    public static final String SENSOR_CODE_WIND_DIR = "a01008";
 
+    /*
+     * ������code
+     * */
+    public static final String SENSOR_CODE_WIND_SPEED = "a01008";
+
+    /*
+     * ������������code
+     * */
+    public static final String SENSOR_CODE_CO= "a21005";
 }
diff --git a/screen-common/src/main/java/com/moral/constant/KafkaConstants.java b/screen-common/src/main/java/com/moral/constant/KafkaConstants.java
index 83edd76..2b3a9f2 100644
--- a/screen-common/src/main/java/com/moral/constant/KafkaConstants.java
+++ b/screen-common/src/main/java/com/moral/constant/KafkaConstants.java
@@ -18,12 +18,17 @@
     public static final String TOPIC_SECOND = "second_data";
 
     /**
-     * ������������������������������������������
+     * ���������������������
      */
-    public static final String GROUP_ID_INSERT = "insert";
+    public static final String GROUP_HOUR = "hour";
+
+    /**
+     * ���������������������
+     */
+    public static final String GROUP_MINUTE = "minute";
 
     /**
      * ���������������������������������
      */
-    public static final String GROUP_ID_STATE = "state";
+    public static final String GROUP_STATE = "state";
 }
diff --git a/screen-common/src/main/java/com/moral/util/AmendUtils.java b/screen-common/src/main/java/com/moral/util/AmendUtils.java
new file mode 100644
index 0000000..fde9768
--- /dev/null
+++ b/screen-common/src/main/java/com/moral/util/AmendUtils.java
@@ -0,0 +1,168 @@
+package com.moral.util;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSONObject;
+import com.moral.constant.Constants;
+
+public class AmendUtils {
+    /**
+     * @param value ���������������������������
+     * @param digit ������������������
+     * @return ���������������������������������������
+     */
+    public static double sciCal(double value, int digit) {
+        String result;
+        try {
+            double ratio = Math.pow(10, digit);
+            double _num = value * ratio;
+            double mod = _num % 1;
+            double integer = Math.floor(_num);
+            double returnNum;
+            if (mod > 0.5) {
+                returnNum = (integer + 1) / ratio;
+            } else if (mod < 0.5) {
+                returnNum = integer / ratio;
+            } else {
+                returnNum = (integer % 2 == 0 ? integer : integer + 1) / ratio;
+            }
+            BigDecimal bg = new BigDecimal(returnNum);
+            result = bg.setScale(digit, BigDecimal.ROUND_HALF_UP).toString();
+        } catch (RuntimeException e) {
+            throw e;
+        }
+        return Double.parseDouble(result);
+    }
+
+    /**
+     * @param list ���������[value={"O3"���12},.....]
+     * @return ������������������������������
+     */
+    public static Object getO3AvgOfDay(List<Map<String, Object>> list) {
+        double max;
+        List<Double> avgs = new ArrayList<>();
+        for (int i = 8; i <= 24; i++) {
+            List<Double> data = new ArrayList<>();
+            for (Map<String, Object> dataMap : list) {
+                Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class);
+                Double o3 = Double.parseDouble(dataValue.get(Constants.SENSOR_CODE_O3).toString());
+                int hour = DateUtils.getHour((Date) dataMap.get("time"));
+                if (hour == 0) {
+                    hour = 24;
+                }
+                if (hour <= i && hour >= i - 7) {
+                    data.add(o3);
+                }
+            }
+            if (data.size() < 6) {
+                continue;
+            }
+            double average = data.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage();
+            avgs.add(average);
+        }
+        max = avgs.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getMax();
+        if (avgs.size() < 14) {
+            if (max < 160d) {
+                return null;
+            }
+        }
+        return sciCal(max, 4);
+    }
+
+    /**
+     * @param list ���������[value={"������"���12������������������200},.....]
+     * @return ���������������������������
+     */
+    public static Object getWindDirAvg(List<Map<String, Object>> list) {
+        double avgDir;
+        double sumSin = 0d;
+        double sumCos = 0d;
+        int size = 0;
+        for (Map<String, Object> map : list) {
+            Map<String, Object> dataValue = JSONObject.parseObject((String) map.get("value"), Map.class);
+            Object wind = dataValue.get(Constants.SENSOR_CODE_WIND_DIR);
+            Object speed = dataValue.get(Constants.SENSOR_CODE_WIND_SPEED);
+            if (wind == null || speed == null) {
+                continue;
+            }
+            size++;
+            int windDir = Integer.parseInt(wind.toString());
+            double windSpeed = Double.parseDouble(speed.toString());
+            double sin = windSpeed * Math.sin(windDir / 180d) * Math.PI;
+            double cos = windSpeed * Math.cos(windDir / 180d) * Math.PI;
+            sumSin += sin;
+            sumCos += cos;
+        }
+        if (size == 0) {
+            return null;
+        }
+        double avgSin = sumSin / size;
+        double avgCos = sumCos / size;
+        if (avgSin > 0 && avgCos > 0) {
+            avgDir = Math.atan(avgSin / avgCos) * 180 / Math.PI;
+        } else if ((avgSin > 0 && avgCos < 0) || (avgSin < 0 && avgCos < 0)) {
+            avgDir = Math.atan(avgSin / avgCos) * 180 / Math.PI + 180;
+        } else {
+            avgDir = Math.atan(avgSin / avgCos) * 180 / Math.PI + 360;
+        }
+        return sciCal(avgDir, 4);
+    }
+
+    /**
+     * @param data ���������������������������
+     * @param p    ������������������95������������p=95
+     * @return ���������������������������
+     */
+    public static double percentile(List<Double> data, int p) {
+        int n = data.size();
+        Collections.sort(data);
+        double v = n / (100 / p);
+        System.out.println(n % (100 / p));
+        if (n % (100 / p) == 0) {
+            if (v == n) {
+                return data.get(n - 1);
+            }
+            return (data.get((int) v - 1) + data.get((int) v)) / 2;
+        }
+        return sciCal(data.get((int) v), 4);
+    }
+
+    public static Object getCOAvgOfWeek(List<Map<String, Object>> list) {
+        List<Double> data = new ArrayList<>();
+        for (Map<String, Object> dataMap : list) {
+            Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class);
+            Object o = dataValue.get(Constants.SENSOR_CODE_CO);
+            if (o == null) {
+                continue;
+            }
+            Double co = Double.parseDouble(o.toString());
+            data.add(co);
+        }
+        if (data.size() == 0) {
+            return null;
+        }
+        return percentile(data, 95);
+    }
+
+    public static Object getO3AvgOfWeek(List<Map<String, Object>> list) {
+        List<Double> data = new ArrayList<>();
+        for (Map<String, Object> dataMap : list) {
+            Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class);
+            Object o = dataValue.get(Constants.SENSOR_CODE_O3);
+            if (o == null) {
+                continue;
+            }
+            Double o3 = Double.parseDouble(o.toString());
+            data.add(o3);
+        }
+        if (data.size() == 0) {
+            return null;
+        }
+        return percentile(data, 90);
+    }
+}
diff --git a/screen-common/src/main/java/com/moral/util/DateUtils.java b/screen-common/src/main/java/com/moral/util/DateUtils.java
index 495e929..1542852 100644
--- a/screen-common/src/main/java/com/moral/util/DateUtils.java
+++ b/screen-common/src/main/java/com/moral/util/DateUtils.java
@@ -1310,4 +1310,12 @@
             throw new RuntimeException(e);
         }
     }
+
+    //���������������
+    public static Date geLastWeekMonday() {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(getDate(getMondayOfThisWeek(),yyyy_MM_dd_EN) );
+        cal.add(Calendar.DATE, -7);
+        return cal.getTime();
+    }
 }
diff --git a/screen-job/src/main/java/com/moral/api/entity/HistoryWeekly.java b/screen-job/src/main/java/com/moral/api/entity/HistoryWeekly.java
new file mode 100644
index 0000000..85e065c
--- /dev/null
+++ b/screen-job/src/main/java/com/moral/api/entity/HistoryWeekly.java
@@ -0,0 +1,44 @@
+package com.moral.api.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * ���������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-06-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class HistoryWeekly extends Model<HistoryWeekly> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ������mac
+     */
+    private String mac;
+
+    /**
+     * ������
+     */
+    private LocalDateTime time;
+
+    /**
+     * ������
+     */
+    private String value;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}
diff --git a/screen-job/src/main/java/com/moral/api/mapper/HistoryWeeklyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/HistoryWeeklyMapper.java
new file mode 100644
index 0000000..2e3aef9
--- /dev/null
+++ b/screen-job/src/main/java/com/moral/api/mapper/HistoryWeeklyMapper.java
@@ -0,0 +1,21 @@
+package com.moral.api.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.moral.api.entity.HistoryWeekly;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * ��������� Mapper ������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-06-30
+ */
+public interface HistoryWeeklyMapper extends BaseMapper<HistoryWeekly> {
+
+    void insertHistoryWeekly(List<Map<String,Object>> list);
+
+}
diff --git a/screen-job/src/main/java/com/moral/api/service/HistoryWeeklyService.java b/screen-job/src/main/java/com/moral/api/service/HistoryWeeklyService.java
new file mode 100644
index 0000000..506c43a
--- /dev/null
+++ b/screen-job/src/main/java/com/moral/api/service/HistoryWeeklyService.java
@@ -0,0 +1,18 @@
+package com.moral.api.service;
+
+import com.moral.api.entity.HistoryWeekly;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * ��������� ���������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-06-30
+ */
+public interface HistoryWeeklyService extends IService<HistoryWeekly> {
+
+    void insertHistoryWeekly();
+
+}
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java
index eec1a25..40a1e1a 100644
--- a/screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java
+++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java
@@ -11,6 +11,7 @@
 import com.moral.api.service.HistoryHourlyService;
 import com.moral.api.service.SensorService;
 import com.moral.constant.Constants;
+import com.moral.util.AmendUtils;
 import com.moral.util.DateUtils;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,10 +47,8 @@
     @Autowired
     private HistoryHourlyService historyHourlyService;
 
-
     @Override
     public void insertHistoryDaily() {
-
         String format = DateUtils.yyyy_MM_dd_EN;
         Date now = new Date();
         //������������
@@ -82,14 +81,20 @@
             List<Map<String, Object>> tempValue = new ArrayList<>(value);
 
             value.removeIf(map -> ((Date) map.get("time")).getTime() == start.getTime());
-            //������8���������������
-            double o3AvgOfDay = getO3AvgOfDay(value);
-            jsonMap.put(Constants.SENSOR_CODE_O3, o3AvgOfDay);
-            System.out.println("������==" + value);
-
-            //���������������������������
+            //������8������������������������������������
+            Object o3AvgOfDay = AmendUtils.getO3AvgOfDay(value);
+            if (o3AvgOfDay != null) {
+                jsonMap.put(Constants.SENSOR_CODE_O3, o3AvgOfDay);
+            }
+            //������������������������������������
             tempValue.removeIf(map -> ((Date) map.get("time")).getTime() == end.getTime());
-            System.out.println("������������==" + tempValue);
+
+            //���������������������������
+            Object windDirAvg = AmendUtils.getWindDirAvg(value);
+            if (windDirAvg != null) {
+                jsonMap.put(Constants.SENSOR_CODE_WIND_DIR, windDirAvg);
+            }
+
             sensorCodes.forEach(sensorCode -> {
                 OptionalDouble optionalDouble = tempValue.parallelStream()
                         .flatMapToDouble(v -> {
@@ -104,41 +109,19 @@
                             return DoubleStream.of(Double.parseDouble(sensorValue.toString()));
                         }).average();
                 if (optionalDouble.isPresent()) {
-                    jsonMap.put(sensorCode.toString(), Double.parseDouble(String.format("%.4f", optionalDouble.getAsDouble())));
+                    //���������������������
+                    double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4);
+                    jsonMap.put(sensorCode.toString(), sciCal);
                 }
             });
             dataMap.put("value", JSONObject.toJSONString(jsonMap));
             insertData.add(dataMap);
         });
 
-        //������8���������������
-        System.out.println(insertData);
+        //���������������
         historyDailyMapper.insertHistoryDaily(insertData);
     }
 
-    //������8���������������
-    private double getO3AvgOfDay(List<Map<String, Object>> list) {
-        double max = 0d;
-        for (int i = 8; i <= 24; i++) {
-            List<Double> data = new ArrayList<>();
-            for (Map<String, Object> dataMap : list) {
-                Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class);
-                Double o3 = Double.parseDouble(dataValue.get(Constants.SENSOR_CODE_O3).toString());
-                int hour = DateUtils.getHour((Date) dataMap.get("time"));
-                if (hour == 0) {
-                    hour = 24;
-                }
-                if (hour <= i && hour >= i - 7) {
-                    data.add(o3);
-                }
-            }
-            double average = data.stream().mapToDouble(aDouble -> aDouble).summaryStatistics().getAverage();
-            if (max < average) {
-                max = average;
-            }
-        }
-        return Double.parseDouble(String.format("%.4f", max));
-    }
 
     public static void main(String[] args) {
         List<Integer> list = new ArrayList<>();
@@ -148,7 +131,7 @@
         list.add(18);//4
         list.add(16);//5
         list.add(22);//6
-        list.add(4);//8
+        list.add(4);//7
         list.add(12);
         list.add(28);
         list.add(26);
@@ -165,7 +148,7 @@
         list.add(12);
         list.add(10);
         list.add(5);
-        list.add(88);
+        list.add(88);//24
         Integer max = 0;
         for (int i = 7; i < list.size(); i++) {
             Integer sum = 0;
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
index e762167..1b3c45d 100644
--- a/screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
+++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
@@ -21,6 +21,7 @@
 import com.moral.api.service.HistoryMinutelyService;
 import com.moral.api.service.SensorService;
 import com.moral.constant.Constants;
+import com.moral.util.AmendUtils;
 import com.moral.util.DateUtils;
 
 @Service
@@ -72,9 +73,17 @@
 
         data.forEach((key, value) -> {
             Map<String, Object> dataMap = new HashMap<>();
-            Map<String, Object> jsonMap = new HashMap<>();
             dataMap.put("mac", key);
             dataMap.put("time", end);
+            Map<String, Object> jsonMap = new HashMap<>();
+
+            //���������������������������
+            Object windDirAvg = AmendUtils.getWindDirAvg(value);
+            if (windDirAvg != null) {
+                jsonMap.put(Constants.SENSOR_CODE_WIND_DIR, windDirAvg);
+            }
+
+            //������������������������������������
             sensorCodes.forEach(sensorCode -> {
                 OptionalDouble optionalDouble = value.parallelStream()
                         .flatMapToDouble(v -> {
@@ -83,10 +92,16 @@
                             if (ObjectUtils.isEmpty(sensorValue)) {
                                 return null;
                             }
+                            //������������������
+                            if (Constants.SENSOR_CODE_WIND_DIR.equals(sensorCode)) {
+                                return null;
+                            }
                             return DoubleStream.of(Double.parseDouble(sensorValue.toString()));
                         }).average();
                 if (optionalDouble.isPresent()) {
-                    jsonMap.put(sensorCode.toString(), Double.parseDouble(String.format("%.4f", optionalDouble.getAsDouble())));
+                    //���������������������
+                    double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4);
+                    jsonMap.put(sensorCode.toString(), sciCal);
                 }
             });
             dataMap.put("value", JSONObject.toJSONString(jsonMap));
@@ -95,11 +110,13 @@
 
         //5���������������
         String insertTimeUnits = DateUtils.dateToDateString(now, DateUtils.yyyyMM_EN);
+        //���������������
         historyFiveMinutelyMapper.insertHistoryFiveMinutely(insertData, insertTimeUnits);
     }
 
+
     public static void main(String[] args) {
-        //������������
+       /* //������������
         List<Map<String, Object>> list = new ArrayList<>();
         Map<String, Object> map1 = new HashMap<>();
         map1.put("mac", "p5dnd1234567");
@@ -154,6 +171,9 @@
         });
 
 
-        System.out.println("666==" + insertData);
+        System.out.println("666==" + insertData);*/
+
+        double a = 5.5d;
+        System.out.println(Math.round(a));
     }
 }
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/HistoryWeeklyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryWeeklyServiceImpl.java
new file mode 100644
index 0000000..95bf167
--- /dev/null
+++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryWeeklyServiceImpl.java
@@ -0,0 +1,147 @@
+package com.moral.api.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.moral.api.entity.HistoryDaily;
+import com.moral.api.entity.HistoryWeekly;
+import com.moral.api.entity.Sensor;
+import com.moral.api.mapper.HistoryWeeklyMapper;
+import com.moral.api.service.HistoryDailyService;
+import com.moral.api.service.HistoryWeeklyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.service.SensorService;
+import com.moral.constant.Constants;
+import com.moral.util.AmendUtils;
+import com.moral.util.DateUtils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.OptionalDouble;
+import java.util.stream.Collectors;
+import java.util.stream.DoubleStream;
+
+/**
+ * <p>
+ * ��������� ���������������
+ * </p>
+ *
+ * @author moral
+ * @since 2021-06-30
+ */
+@Service
+public class HistoryWeeklyServiceImpl extends ServiceImpl<HistoryWeeklyMapper, HistoryWeekly> implements HistoryWeeklyService {
+
+    @Autowired
+    private HistoryWeeklyMapper historyWeeklyMapper;
+
+    @Autowired
+    private SensorService sensorService;
+
+    @Autowired
+    private HistoryDailyService historyDailyService;
+
+    @Override
+    public void insertHistoryWeekly() {
+        Date now = new Date();
+        //������������������������
+        Date start = DateUtils.geLastWeekMonday();
+        //������
+        QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>();
+        sensorQueryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE);
+        List<Object> sensorCodes = sensorService.listObjs(sensorQueryWrapper);
+
+        //���������������������������
+        QueryWrapper<HistoryDaily> historyDailyQueryWrapper = new QueryWrapper<>();
+        historyDailyQueryWrapper.ge("time", DateUtils.dateToDateString(start)).lt("time", DateUtils.dateToDateString(now));
+        List<Map<String, Object>> weeklyData = historyDailyService.listMaps(historyDailyQueryWrapper);
+
+        //���mac������
+        Map<String, List<Map<String, Object>>> data = weeklyData.parallelStream().collect(Collectors.groupingBy(o -> (String) o.get("mac")));
+
+        //���������������������������
+        List<Map<String, Object>> insertData = new ArrayList<>();
+
+        data.forEach((key, value) -> {
+            Map<String, Object> dataMap = new HashMap<>();
+            Map<String, Object> jsonMap = new HashMap<>();
+            dataMap.put("mac", key);
+            dataMap.put("time", start);
+
+            //���������������������������
+            Object windDirAvg = AmendUtils.getWindDirAvg(value);
+            if (windDirAvg != null) {
+                jsonMap.put(Constants.SENSOR_CODE_WIND_DIR, windDirAvg);
+            }
+
+            //CO 95������������������������
+            Object coAvg = AmendUtils.getCOAvgOfWeek(value);
+            if (coAvg != null) {
+                jsonMap.put(Constants.SENSOR_CODE_CO, coAvg);
+            }
+
+            //CO 90������������������������
+            Object o3Avg = AmendUtils.getO3AvgOfWeek(value);
+            if (o3Avg != null) {
+                jsonMap.put(Constants.SENSOR_CODE_O3, o3Avg);
+            }
+
+            sensorCodes.forEach(sensorCode -> {
+                OptionalDouble optionalDouble = value.parallelStream()
+                        .flatMapToDouble(v -> {
+                            Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class);
+                            Object sensorValue = dataValue.get(sensorCode.toString());
+                            if (ObjectUtils.isEmpty(sensorValue)) {
+                                return null;
+                            }
+                            //������������������
+                            if (Constants.SENSOR_CODE_WIND_DIR.equals(sensorCode)) {
+                                return null;
+                            }
+                            //CO������������
+                            if (Constants.SENSOR_CODE_CO.equals(sensorCode)) {
+                                return null;
+                            }
+                            //O3������������
+                            if (Constants.SENSOR_CODE_O3.equals(sensorCode)) {
+                                return null;
+                            }
+                            return DoubleStream.of(Double.parseDouble(sensorValue.toString()));
+                        }).average();
+                if (optionalDouble.isPresent()) {
+                    //���������������������
+                    double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4);
+                    jsonMap.put(sensorCode.toString(), sciCal);
+                }
+            });
+            dataMap.put("value", JSONObject.toJSONString(jsonMap));
+            insertData.add(dataMap);
+        });
+
+        //���������������
+        historyWeeklyMapper.insertHistoryWeekly(insertData);
+    }
+
+    public static void main(String[] args) {
+        List<Double> data = new ArrayList<>();
+        data.add(7d);
+        data.add(15d);
+        data.add(36d);
+        data.add(39d);
+        data.add(40d);
+        data.add(41d);
+        data.add(20d);
+        data.add(18d);
+        System.out.println(data);
+        System.out.println(AmendUtils.percentile(data, 95));
+
+    }
+
+
+}
diff --git a/screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java b/screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java
index fcc205c..88b63a2 100644
--- a/screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java
+++ b/screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java
@@ -3,16 +3,9 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.alibaba.fastjson.JSON;
-import com.moral.api.entity.HistoryDaily;
 import com.moral.api.service.HistoryDailyService;
 import com.moral.api.service.HistoryFiveMinutelyService;
+import com.moral.api.service.HistoryWeeklyService;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
@@ -21,10 +14,13 @@
 public class HistoryTableInsertTask {
 
     @Autowired
+    private HistoryFiveMinutelyService historyFiveMinutelyService;
+
+    @Autowired
     private HistoryDailyService historyDailyService;
 
     @Autowired
-    private HistoryFiveMinutelyService historyFiveMinutelyService;
+    private HistoryWeeklyService historyWeeklyService;
 
     //5������������������
     @XxlJob("insertHistoryFiveMinutely")
@@ -49,4 +45,16 @@
         }
         return ReturnT.SUCCESS;
     }
+
+    //���������������
+    @XxlJob("insertHistoryWeekly")
+    public ReturnT insertHistoryWeekly() {
+        try {
+            historyWeeklyService.insertHistoryWeekly();
+        } catch (Exception e) {
+            XxlJobHelper.log(e.getMessage());
+            return ReturnT.FAIL;
+        }
+        return ReturnT.SUCCESS;
+    }
 }
diff --git a/screen-job/src/main/resources/mapper/HistoryWeeklyMapper.xml b/screen-job/src/main/resources/mapper/HistoryWeeklyMapper.xml
new file mode 100644
index 0000000..c47833f
--- /dev/null
+++ b/screen-job/src/main/resources/mapper/HistoryWeeklyMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.moral.api.mapper.HistoryWeeklyMapper">
+
+    <!-- ������������������������ -->
+    <resultMap id="BaseResultMap" type="com.moral.api.entity.HistoryWeekly">
+        <result column="mac" property="mac"/>
+        <result column="time" property="time"/>
+        <result column="value" property="value"/>
+    </resultMap>
+
+    <insert id="insertHistoryWeekly">
+        INSERT INTO history_weekly
+        VALUES
+        <foreach collection="list" item="item" separator=",">
+            (#{item.mac},#{item.time},#{item.value})
+        </foreach>
+    </insert>
+
+</mapper>
\ No newline at end of file
diff --git a/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java b/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java
index 94ec2f1..8b185e0 100644
--- a/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java
+++ b/screen-manage/src/main/java/com/moral/api/kafka/consumer/KafkaConsumer.java
@@ -37,7 +37,7 @@
     private RedisTemplate redisTemplate;
 
     //������������
-    @KafkaListener(topics = KafkaConstants.TOPIC_MINUTE, groupId = KafkaConstants.GROUP_ID_INSERT, containerFactory = "kafkaListenerContainerFactory")
+    @KafkaListener(topics = KafkaConstants.TOPIC_MINUTE, groupId = KafkaConstants.GROUP_MINUTE, containerFactory = "kafkaListenerContainerFactory")
     public void listenMinute(ConsumerRecord<String, String> record, Acknowledgment ack) {
         String msg = record.value();
         try {
@@ -68,7 +68,7 @@
     }
 
     //������������
-    @KafkaListener(topics = KafkaConstants.TOPIC_HOUR, groupId = KafkaConstants.GROUP_ID_INSERT, containerFactory = "kafkaListenerContainerFactory")
+    @KafkaListener(topics = KafkaConstants.TOPIC_HOUR, groupId = KafkaConstants.GROUP_HOUR, containerFactory = "kafkaListenerContainerFactory")
     public void listenHour(ConsumerRecord<String, String> record, Acknowledgment ack) {
         String msg = record.value();
         try {
@@ -99,7 +99,7 @@
     }
 
     //������������������������������������������������������
-    @KafkaListener(topics = KafkaConstants.TOPIC_SECOND, groupId = KafkaConstants.GROUP_ID_STATE, containerFactory = "kafkaListenerContainerFactory")
+    @KafkaListener(topics = KafkaConstants.TOPIC_SECOND, groupId = KafkaConstants.GROUP_STATE, containerFactory = "kafkaListenerContainerFactory")
     public void listenSecond(ConsumerRecord<String, String> record, Acknowledgment ack) {
         String msg = record.value();
         try {

--
Gitblit v1.8.0