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