package com.moral.strategy; import com.alibaba.fastjson.JSON; import com.moral.entity.History; import com.moral.service.HistoryFiveMinutelyService; import com.moral.service.SensorService; import com.moral.util.DateUtil; import com.xxl.job.core.biz.model.ReturnT; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; @Service public class RepairFiveMinutelyData implements RepairDataStrategy { @Resource SensorService sensorService; @Resource HistoryFiveMinutelyService historyFiveMinutelyService; @Resource RedisTemplate redisTemplate; @Override public void repairData(String time,MultiValueMap result) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String repairTime = sdf.format(new Date(Long.parseLong(time) * 1000)); /*根据时间从分钟表数据钟查询五分钟数据的平均值*/ Map params = getStartAndEndTime(time); List sensorKeys = sensorService.getSensorKeys(); params.put("sensorKeys", sensorKeys); List> fiveMinutesSensorDatas; /*将得到的数据进行转换*/ List> insertDatas; try { fiveMinutesSensorDatas = historyFiveMinutelyService.getFiveMinutesSensorData(params); insertDatas = new ArrayList<>(); for (Map data : fiveMinutesSensorDatas) { String mac = (String) data.get("mac"); data.remove("mac"); Map keyAndValueMap = new LinkedHashMap<>(); Map insertDataMap = new LinkedHashMap<>(); data.forEach((key, value) -> { key = key.substring(3); List list = null; if (ObjectUtils.isEmpty(keyAndValueMap.get(key))) { list = new ArrayList<>(); } else { list = (List) keyAndValueMap.get(key); } if (value instanceof Double) { value = String.valueOf(value); value = value.equals("0.0") ? 0 : Double.valueOf((String) value); } list.add(value); keyAndValueMap.put(key, list); }); String keyAndValueJson = JSON.toJSONString(keyAndValueMap); insertDataMap.put("mac", mac); insertDataMap.put("time", params.get("end")); insertDataMap.put("json", keyAndValueJson); insertDatas.add(insertDataMap); } /*将数据插入数据库*/ historyFiveMinutelyService.insertHistoryFiveMinutely(insertDatas, (String) params.get("yearAndMonth")); } catch (Exception e) { result.add("500","修补五分钟数据失败-"+repairTime); redisTemplate.opsForList().leftPush("unSuccessRepair_data","fiveMinutely_"+repairTime); return; } result.add("200","修补五分钟数据成功-"+repairTime); } private Map getStartAndEndTime(String paramTime) { Map map = new HashMap<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(Long.parseLong(paramTime) * 1000); String minute = DateUtil.getMinute(date); String year = ""; String month = ""; String yearAndMonth = ""; String startTime = ""; String endTime = ""; Integer endMinute = Integer.parseInt(String.valueOf(minute.charAt(minute.length() - 1))); if (endMinute >= 5) { StringBuilder time = new StringBuilder(sdf.format(date)); startTime = time.replace(15, 19, "0:00").toString(); endTime = time.replace(15, 19, "5:00").toString(); } else { StringBuilder endTimesb = new StringBuilder(sdf.format(date)); endTime = endTimesb.replace(15, 19, "0:00").toString(); date = DateUtil.rollMinute(date, -5); StringBuilder startTimesb = new StringBuilder(sdf.format(date)); startTime = startTimesb.replace(15, 19, "5:00").toString(); } year = DateUtil.getYear(date); month = DateUtil.getMonth(date); yearAndMonth = year + month; map.put("start", startTime); map.put("end", endTime); map.put("yearAndMonth", yearAndMonth); return map; } }