From c49d3947b165e0868d48a4c969e55093b8d05705 Mon Sep 17 00:00:00 2001
From: jinpengyong <jpy123456>
Date: Tue, 19 May 2020 17:06:11 +0800
Subject: [PATCH] alarm_daily统计任务,创建alarm年月分表任务,alarm相关接口更新

---
 src/main/resources/mapper/AlarmMapper.xml                  |   44 +++++++++++
 src/main/java/com/moral/mapper/AlarmMapper.java            |   15 +++
 src/main/java/com/moral/service/impl/AlarmServiceImpl.java |   35 ++++++++
 src/main/java/com/moral/service/AlarmService.java          |   13 +++
 src/main/java/com/moral/task/AlarmTableInsertTask.java     |  101 +++++++++++++++++++++++++
 5 files changed, 208 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/moral/mapper/AlarmMapper.java b/src/main/java/com/moral/mapper/AlarmMapper.java
new file mode 100644
index 0000000..902ca3e
--- /dev/null
+++ b/src/main/java/com/moral/mapper/AlarmMapper.java
@@ -0,0 +1,15 @@
+package com.moral.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface AlarmMapper {
+
+    List<Map<String, Object>> getAvgAlarmData(Map<String, Object> devices);
+
+    int insertAlarmDaily(List<Map<String,Object>> list);
+
+    void createTable(@Param("yearAndMonth") String yearAndMonth);
+}
diff --git a/src/main/java/com/moral/service/AlarmService.java b/src/main/java/com/moral/service/AlarmService.java
new file mode 100644
index 0000000..c16ebe8
--- /dev/null
+++ b/src/main/java/com/moral/service/AlarmService.java
@@ -0,0 +1,13 @@
+package com.moral.service;
+
+import java.util.List;
+import java.util.Map;
+
+public interface AlarmService {
+
+    List<Map<String, Object>> getAvgAlarmData(Map<String,Object> devices);
+
+    int insertAlarmDaily(List<Map<String,Object>> list);
+
+    void createTable(String yearAndMonth);
+}
diff --git a/src/main/java/com/moral/service/impl/AlarmServiceImpl.java b/src/main/java/com/moral/service/impl/AlarmServiceImpl.java
new file mode 100644
index 0000000..df9dd46
--- /dev/null
+++ b/src/main/java/com/moral/service/impl/AlarmServiceImpl.java
@@ -0,0 +1,35 @@
+package com.moral.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+
+import com.moral.mapper.AlarmMapper;
+import com.moral.service.AlarmService;
+
+
+@Service
+public class AlarmServiceImpl implements AlarmService {
+
+    @Resource
+    private AlarmMapper alarmMapper;
+
+    @Override
+    public List<Map<String, Object>> getAvgAlarmData(Map<String, Object> devices) {
+        return alarmMapper.getAvgAlarmData(devices);
+    }
+
+    @Override
+    public int insertAlarmDaily(List<Map<String, Object>> list) {
+        return alarmMapper.insertAlarmDaily(list);
+    }
+
+    @Override
+    public void createTable(String yearAndMonth) {
+        alarmMapper.createTable(yearAndMonth);
+    }
+
+}
diff --git a/src/main/java/com/moral/task/AlarmTableInsertTask.java b/src/main/java/com/moral/task/AlarmTableInsertTask.java
new file mode 100644
index 0000000..44bf14d
--- /dev/null
+++ b/src/main/java/com/moral/task/AlarmTableInsertTask.java
@@ -0,0 +1,101 @@
+package com.moral.task;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.moral.service.AlarmService;
+import com.moral.service.DeviceService;
+import com.moral.service.SensorService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+
+public class AlarmTableInsertTask {
+    private static transient Logger logger = LoggerFactory.getLogger(AlarmTableInsertTask.class);
+    @Resource
+    private AlarmService alarmService;
+
+    @Resource
+    private SensorService sensorService;
+
+    @Resource
+    private DeviceService deviceService;
+
+    @XxlJob("alarmDaily")
+    public ReturnT insertAlarmDailyTable(String params) {
+        LocalDateTime time = LocalDateTime.now();
+        LocalDateTime endTime = time.truncatedTo(ChronoUnit.DAYS);
+        LocalDateTime startTime = endTime.minusDays(1);
+        List<String> sensorKeys = sensorService.getSensorKeys();
+        List<String> macs = deviceService.getMacs();
+
+        String year = startTime.getYear() + "";
+        String month = null;
+        int monthValue = startTime.getMonthValue();
+        if (monthValue < 10) {
+            month = "0" + monthValue;
+        } else {
+            month = monthValue + "";
+        }
+        String yearAndMonth = year + month;
+
+        Map<String, Object> devices = new HashMap<>();
+        devices.put("sensorKeys", sensorKeys);
+        devices.put("start", startTime);
+        devices.put("end", endTime);
+        devices.put("macs", macs);
+        devices.put("yearAndMonth",yearAndMonth);
+
+        List<Map<String, Object>> dailyData = alarmService.getAvgAlarmData(devices);
+        List<Map<String, Object>> dailyDataList = new ArrayList<>();
+        for (Map<String, Object> deviceData : dailyData) {
+            Map<String, Object> map = new HashMap<>();
+            for (String sensorKey : sensorKeys) {
+                if (deviceData.get(sensorKey) != null) {
+                    map.put(sensorKey, deviceData.get(sensorKey).toString());
+                }
+            }
+            JSONObject json = new JSONObject(map);
+            deviceData.put("json", json);
+        }
+
+        for (Map<String, Object> dailyMap : dailyData) {
+            Map<String, Object> map = new HashMap<>();
+            String mac = dailyMap.get("mac").toString();
+            String json = dailyMap.get("json").toString();
+            String state = dailyMap.get("state").toString();
+            map.put("mac", mac);
+            map.put("json", json);
+            map.put("state", state);
+            map.put("time", startTime);
+            dailyDataList.add(map);
+        }
+        if (!CollectionUtils.isEmpty(dailyDataList)) {
+            alarmService.insertAlarmDaily(dailyDataList);
+            return new ReturnT(200, "������������������");
+        }
+        return new ReturnT(500, "������������������");
+    }
+
+
+    @XxlJob("createAlarmSubTable")
+    public void createAlarmSubTable(String params) {
+        LocalDateTime time = LocalDateTime.now().plusMonths(1);;
+        String year = time.getYear() + "";
+        String month = time.getMonthValue() + "";
+        if (time.getMonthValue() < 10) {
+            month = "0" + time.getMonthValue();
+        }
+        alarmService.createTable(year + month);
+    }
+}
diff --git a/src/main/resources/mapper/AlarmMapper.xml b/src/main/resources/mapper/AlarmMapper.xml
new file mode 100644
index 0000000..210ab59
--- /dev/null
+++ b/src/main/resources/mapper/AlarmMapper.xml
@@ -0,0 +1,44 @@
+<?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.mapper.AlarmMapper">
+    <select id="getAvgAlarmData" resultType="java.util.LinkedHashMap">
+        SELECT
+        a.mac,
+        max(a.state) state
+        <foreach collection="sensorKeys" open="," separator="," item="sensorKey">
+            AVG(a.json->'$.${sensorKey}[0]') AS '${sensorKey}'
+        </foreach>
+        FROM
+        alarm_${yearAndMonth} a
+        WHERE
+        a.time >= #{start}
+        AND a.time <![CDATA[<]]> #{end}
+        AND a.mac in
+        <foreach collection="macs" open="(" separator="," close=")"
+                 item="mac">
+            #{mac}
+        </foreach>
+        group by
+        a.mac
+    </select>
+
+    <insert id="insertAlarmDaily">
+        insert into
+        alarm_daily
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.mac},#{item.json},#{item.state},#{item.time})
+        </foreach>
+    </insert>
+
+    <update id="createTable">
+        CREATE TABLE `alarm_${yearAndMonth}` (
+        `mac` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
+        `json` json DEFAULT NULL,
+        `state` int(2) DEFAULT NULL,
+        `time` datetime DEFAULT NULL,
+        KEY `_idx_time` (`time`) USING BTREE,
+        KEY `_idx_mac` (`mac`) USING BTREE)
+        ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC;
+    </update>
+</mapper>
\ No newline at end of file

--
Gitblit v1.8.0