From faf8649ff22b8af12c758355725389204838e02a Mon Sep 17 00:00:00 2001 From: jinpengyong <jpy123456> Date: Thu, 05 Aug 2021 13:23:54 +0800 Subject: [PATCH] 小时缺失数据补充定时任务 --- screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java | 5 /dev/null | 29 ---- screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java | 6 - screen-job/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java | 77 +----------- screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java | 4 screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java | 2 screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java | 25 ++-- screen-job/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java | 133 ++++++++++++++++++++- screen-job/src/main/resources/mapper/HistoryHourlyMapper.xml | 13 -- screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java | 7 - screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml | 16 +- 11 files changed, 156 insertions(+), 161 deletions(-) diff --git a/screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java index 79d40fc..f52b66c 100644 --- a/screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java +++ b/screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java @@ -17,8 +17,4 @@ void insertHistoryHourly(List<HistoryHourly> list); - List<HistoryHourly> getHistoryHourlyTransition(); - - void deleteHistoryHourlyTransition(); - } diff --git a/screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java index dd466df..ab354d9 100644 --- a/screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java +++ b/screen-job/src/main/java/com/moral/api/mapper/HistoryMinutelyMapper.java @@ -7,5 +7,5 @@ void createTable(String timeUnits); - List<Map<String, Object>> getHistoryFiveMinutelyData(Map<String,Object> params); + List<Map<String, Object>> getHistoryMinutelyData(Map<String, Object> params); } diff --git a/screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java b/screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java index fa49b22..9e847bd 100644 --- a/screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java +++ b/screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java @@ -13,10 +13,7 @@ */ public interface HistoryHourlyService extends IService<HistoryHourly> { - //������������������������������������ + //������������������������ void insertHistoryHourly(); - - //��������������������������� - void deleteHistoryHourlyTransition(); } diff --git a/screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java b/screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java index 084935e..6b456f0 100644 --- a/screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java +++ b/screen-job/src/main/java/com/moral/api/service/HistoryMinutelyService.java @@ -1,14 +1,8 @@ package com.moral.api.service; -import java.util.List; -import java.util.Map; - public interface HistoryMinutelyService { //��������������� void createTable(String timeUnits); - - //������������������5������������ - List<Map<String, Object>> getHistoryFiveMinutelyData(Map<String, Object> params); } 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 368cfb5..ecdfd80 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 @@ -19,8 +19,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.Sensor; import com.moral.api.mapper.HistoryFiveMinutelyMapper; +import com.moral.api.mapper.HistoryMinutelyMapper; import com.moral.api.service.HistoryFiveMinutelyService; -import com.moral.api.service.HistoryMinutelyService; import com.moral.api.service.SensorService; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; @@ -34,18 +34,18 @@ private HistoryFiveMinutelyMapper historyFiveMinutelyMapper; @Autowired - private HistoryMinutelyService historyMinutelyService; + private HistoryMinutelyMapper historyMinutelyMapper; @Autowired private SensorService sensorService; + + @Autowired + private RedisTemplate redisTemplate; @Override public void createTable(String timeUnits) { historyFiveMinutelyMapper.createTable(timeUnits); } - - @Autowired - private RedisTemplate redisTemplate; @Override @Transactional @@ -69,8 +69,8 @@ queryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE); List<Object> sensorCodes = sensorService.listObjs(queryWrapper); - //���������������������5������������ - List<Map<String, Object>> fiveMinutelyData = historyMinutelyService.getHistoryFiveMinutelyData(params); + //���������������������5������������������ + List<Map<String, Object>> fiveMinutelyData = historyMinutelyMapper.getHistoryMinutelyData(params); if (fiveMinutelyData.size() == 0) { return; } @@ -125,68 +125,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"); - map1.put("value", "{\"a0001\": 10, \"a0002\": 8, \"a0001-Flag\": \"N\", \"a0002-Flag\": \"N\"}"); - Map<String, Object> map2 = new HashMap<>(); - map2.put("mac", "p5dnd123456789"); - map2.put("value", "{\"a0001\": 12, \"a0002\": 12, \"a0001-Flag\": \"N\", \"a0002-Flag\": \"N\"}"); - Map<String, Object> map3 = new HashMap<>(); - map3.put("mac", "p5dnd1234567"); - map3.put("value", "{\"a0001\": 6, \"a0002\": 20, \"a0001-Flag\": \"N\", \"a0002-Flag\": \"N\", \"a0003\": 14}"); - Map<String, Object> map4 = new HashMap<>(); - map4.put("mac", "p5dnd1234567"); - map4.put("value", "{\"a0001\": 4, \"a0002\": 16, \"a0001-Flag\": \"N\", \"a0002-Flag\": \"N\", \"a0003\": 16}"); - list.add(map1); - list.add(map2); - list.add(map3); - list.add(map4); - - //���������mac������ - Map<String, List<Map<String, Object>>> data = list.parallelStream().collect(Collectors.groupingBy(o -> (String) o.get("mac"))); - System.out.println(data); - - //������������ - List<Object> sensors = new ArrayList<>(); - sensors.add("a0001"); - sensors.add("a0002"); - sensors.add("a0003"); - - //������������������������ - 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); - sensors.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; - } - return DoubleStream.of(Double.parseDouble(sensorValue.toString())); - }).average(); - if (optionalDouble.isPresent()) { - jsonMap.put(sensorCode.toString(), Double.parseDouble(String.format("%.4f", optionalDouble.getAsDouble()))); - } - }); - dataMap.put("value", JSONObject.toJSONString(jsonMap)); - insertData.add(dataMap); - }); - - - 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/HistoryHourlyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java index d22e534..dd63413 100644 --- a/screen-job/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java +++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java @@ -1,14 +1,33 @@ package com.moral.api.service.impl; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.HistoryHourly; +import com.moral.api.entity.Sensor; import com.moral.api.mapper.HistoryHourlyMapper; +import com.moral.api.mapper.HistoryMinutelyMapper; import com.moral.api.service.HistoryHourlyService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.api.service.SensorService; +import com.moral.constant.Constants; +import com.moral.constant.RedisConstants; +import com.moral.util.AmendUtils; +import com.moral.util.DateUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; 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.Set; +import java.util.stream.Collectors; +import java.util.stream.DoubleStream; /** * <p> @@ -24,15 +43,113 @@ @Autowired private HistoryHourlyMapper historyHourlyMapper; - @Override - public void insertHistoryHourly() { - //��������������������������� - List<HistoryHourly> list = historyHourlyMapper.getHistoryHourlyTransition(); - historyHourlyMapper.insertHistoryHourly(list); - } + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private HistoryMinutelyMapper historyMinutelyMapper; + + @Autowired + private SensorService sensorService; @Override - public void deleteHistoryHourlyTransition() { - historyHourlyMapper.deleteHistoryHourlyTransition(); + public void insertHistoryHourly() { + //������������������yyyy-MM-dd HH:mm + String format = DateUtils.yyyy_MM_dd_HH_EN; + + //redis������������������mac + Set<String> macs = redisTemplate.opsForHash().keys(RedisConstants.DEVICE); + //������������������������ + Date now = new Date(); + String time = DateUtils.dateToDateString(now, format) + ":00:00"; + + QueryWrapper<HistoryHourly> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("time", time); + //������������������������������������������������macs������������������������������ + Integer count = historyHourlyMapper.selectCount(queryWrapper); + if (macs.size() > count) { + macs.removeIf(mac -> { + queryWrapper.clear(); + queryWrapper.eq("time", time); + queryWrapper.eq("mac", mac); + Integer num = historyHourlyMapper.selectCount(queryWrapper); + return num != 0; + }); + } + + Map<String, Object> params = new HashMap<>(); + + //������������ + String dateString = DateUtils.getDateStringOfHour(-1, format); + Date start = DateUtils.getDate(dateString, format); + + //������������ + Date end = DateUtils.dataToTimeStampTime(now, format); + + //������������������������������������������ + String timeUnits = DateUtils.dateToDateString(start, DateUtils.yyyyMM_EN); + + //������ + QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>(); + sensorQueryWrapper.select("code").eq("is_delete", Constants.NOT_DELETE); + List<Object> sensorCodes = sensorService.listObjs(sensorQueryWrapper); + + params.put("timeUnits", timeUnits); + params.put("start", start); + params.put("end", end); + params.put("macs", macs); + //���������������������1������������������ + List<Map<String, Object>> hourlyData = historyMinutelyMapper.getHistoryMinutelyData(params); + if (hourlyData.size() == 0) { + return; + } + + //���mac������ + Map<String, List<Map<String, Object>>> data = hourlyData.parallelStream() + .collect(Collectors.groupingBy(o -> (String) o.get("mac"))); + + //��������������������������� + List<HistoryHourly> insertData = new ArrayList<>(); + + data.forEach((key, value) -> { + HistoryHourly historyHourly = new HistoryHourly(); + historyHourly.setMac(key); + historyHourly.setTime(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 -> { + 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; + } + return DoubleStream.of(Double.parseDouble(sensorValue.toString())); + }).average(); + if (optionalDouble.isPresent()) { + //��������������������� + double sciCal = AmendUtils.sciCal(optionalDouble.getAsDouble(), 4); + jsonMap.put(sensorCode.toString(), sciCal); + } + }); + historyHourly.setValue(JSONObject.toJSONString(jsonMap)); + historyHourly.setVersion((Integer) value.get(0).get("version")); + insertData.add(historyHourly); + }); + + //��������������� + historyHourlyMapper.insertHistoryHourly(insertData); } } diff --git a/screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java index 730ef35..716ba8e 100644 --- a/screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java +++ b/screen-job/src/main/java/com/moral/api/service/impl/HistoryMinutelyServiceImpl.java @@ -3,9 +3,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Map; - import com.moral.api.mapper.HistoryMinutelyMapper; import com.moral.api.service.HistoryMinutelyService; @@ -20,8 +17,4 @@ historyMinutelyMapper.createTable(timeUnits); } - @Override - public List<Map<String, Object>> getHistoryFiveMinutelyData(Map<String, Object> params) { - return historyMinutelyMapper.getHistoryFiveMinutelyData(params); - } } diff --git a/screen-job/src/main/java/com/moral/api/task/DeleteHistoryHourlyTransitionTask.java b/screen-job/src/main/java/com/moral/api/task/DeleteHistoryHourlyTransitionTask.java deleted file mode 100644 index 312deb7..0000000 --- a/screen-job/src/main/java/com/moral/api/task/DeleteHistoryHourlyTransitionTask.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.moral.api.task; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.moral.api.service.HistoryHourlyService; -import com.xxl.job.core.biz.model.ReturnT; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; - -@Component -public class DeleteHistoryHourlyTransitionTask { - - @Autowired - private HistoryHourlyService historyHourlyService; - - //��������������������������� - @XxlJob("deleteHourlyTransition") - public ReturnT insertHistoryFiveMinutely() { - try { - historyHourlyService.deleteHistoryHourlyTransition(); - } catch (Exception e) { - XxlJobHelper.log(e.getMessage()); - return ReturnT.FAIL; - } - return ReturnT.SUCCESS; - } - -} 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 5ef990c..0ef79d9 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 @@ -42,19 +42,6 @@ return ReturnT.SUCCESS; } - //��������������������������������������� - @XxlJob("insertHistoryHourly") - public ReturnT insertHistoryHourly() { - try { - historyHourlyService.insertHistoryHourly(); - } catch (Exception e) { - XxlJobHelper.log(e.getMessage()); - return ReturnT.FAIL; - } - return ReturnT.SUCCESS; - } - - //��������������� @XxlJob("insertHistoryDaily") public ReturnT insertHistoryDaily() { @@ -90,4 +77,16 @@ } return ReturnT.SUCCESS; } + + //������������������������ + @XxlJob("historyHourlySupplement") + public ReturnT historyHourlySupplement() { + try { + historyHourlyService.insertHistoryHourly(); + } catch (Exception e) { + XxlJobHelper.log(e.getMessage()); + return ReturnT.FAIL; + } + return ReturnT.SUCCESS; + } } diff --git a/screen-job/src/main/resources/mapper/HistoryHourlyMapper.xml b/screen-job/src/main/resources/mapper/HistoryHourlyMapper.xml index f80edaf..9f9c679 100644 --- a/screen-job/src/main/resources/mapper/HistoryHourlyMapper.xml +++ b/screen-job/src/main/resources/mapper/HistoryHourlyMapper.xml @@ -16,17 +16,4 @@ (#{item.mac}, #{item.time}, #{item.value}, #{item.version}) </foreach> </insert> - - <select id="getHistoryHourlyTransition" resultType="com.moral.api.entity.HistoryHourly"> - SELECT mac, - `time`, - `value`, - `version` - FROM history_hourly_transition - WHERE create_time = update_time - </select> - - <delete id="deleteHistoryHourlyTransition"> - DELETE FROM history_hourly_transition - </delete> </mapper> \ No newline at end of file diff --git a/screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml b/screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml index 5cde6ff..e806e90 100644 --- a/screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml +++ b/screen-job/src/main/resources/mapper/HistoryMinutelyMapper.xml @@ -8,19 +8,23 @@ `time` datetime DEFAULT NULL COMMENT '������������', `value` json DEFAULT NULL COMMENT '������', `version` INT (11) DEFAULT NULL COMMENT '������', - KEY `idx_mac` (`mac`), - KEY `idx_time` (`time`), KEY `idx_mac_time` (`mac`,`time`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '���������������' </update> - <select id="getHistoryFiveMinutelyData" resultType="java.util.LinkedHashMap"> + <select id="getHistoryMinutelyData" resultType="java.util.LinkedHashMap"> SELECT - mac, value + mac, `value`, version FROM history_minutely_${timeUnits} - WHERE time <![CDATA[>=]]> #{start} - AND time <![CDATA[<]]> #{end} + WHERE `time` <![CDATA[>=]]> #{start} + AND `time` <![CDATA[<]]> #{end} + <if test="macs != null"> + AND mac IN + <foreach collection="macs" item="mac" open="(" close=")" separator=","> + #{mac} + </foreach> + </if> </select> </mapper> \ No newline at end of file -- Gitblit v1.8.0