From 539a7077cbf638a5aa9ae5e46c17be96daba7d9b Mon Sep 17 00:00:00 2001 From: fengxiang <110431245@qq.com> Date: Mon, 02 Jul 2018 10:54:19 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java | 176 +++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 113 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java b/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java index 6c5ce12..4fd39e3 100644 --- a/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java +++ b/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java @@ -4,7 +4,7 @@ import static org.springframework.util.ObjectUtils.isEmpty; import java.math.BigDecimal; -import java.math.RoundingMode; +import java.text.ParseException; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; @@ -15,7 +15,6 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -31,11 +30,6 @@ import javax.annotation.Resource; -import com.moral.common.util.ReportTimeFormat; -import com.moral.entity.charts.DataCondition; -import com.moral.entity.charts.LineChartCriteria; -import com.moral.entity.charts.PairData; -import com.moral.entity.charts.TimePeriod; import org.apache.commons.lang3.time.DateUtils; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; @@ -43,17 +37,22 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.moral.common.util.CalculateUtils; +import com.moral.common.util.ReportTimeFormat; import com.moral.common.util.ResourceUtil; import com.moral.common.util.ValidateUtil; -import com.moral.entity.Device; import com.moral.entity.Sensor; +import com.moral.entity.charts.DataCondition; +import com.moral.entity.charts.LineChartCriteria; +import com.moral.entity.charts.TimePeriod; +import com.moral.mapper.AlarmDailyMapper; +import com.moral.mapper.AlarmMapper; import com.moral.mapper.DeviceMapper; import com.moral.mapper.HistoryMinutelyMapper; import com.moral.mapper.SensorMapper; import com.moral.service.HistoryMinutelyService; @Service -@SuppressWarnings({ "unchecked", "rawtypes", "unused" }) +@SuppressWarnings({ "unchecked", "unused", "rawtypes" }) public class HistoryMinutelyServiceImpl implements HistoryMinutelyService { @Resource @@ -65,19 +64,19 @@ @Resource private SensorMapper sensorMapper; - // volatile + @Resource + private AlarmDailyMapper alarmDailyMapper; @Override public Map<String, Object> getDayAQIByDevice(Map<String, Object> parameters) { - ValidateUtil.notNull(parameters.get("mac"), "param.is.null"); + //ValidateUtil.notNull(parameters.get("mac"), "param.is.null"); LocalDate localDate = LocalDate.now(); // ������00:00:00 parameters.put("start", localDate.minusDays(1)); // ������00:00:00 parameters.put("end", localDate); - String[] macKeys = { "e1", "e2", "e10", "e11", "e15", "e16" }; - parameters.put("sensorKeys", Arrays.asList(macKeys)); + parameters.put("sensorKeys", Arrays.asList("e1", "e2", "e10", "e11", "e15", "e16")); Map<String, Double> average = historyMinutelyMapper.getSersionAvgByDevice(parameters); return getAQIByDataMap(average); } @@ -135,8 +134,8 @@ } @Override - public Map<String, List<Object>> getCompareReport(Map<String, Object> parameters) throws Exception { - Map<String, List<Object>> resultMap = new HashMap<String, List<Object>>(); + public Map<String, List> getCompareReport(Map<String, Object> parameters) throws Exception { + Map<String, List> resultMap = new HashMap<String, List>(); List<Map<String, Object>> list = JSON.parseObject((String)parameters.remove("items"), new TypeReference<List<Map<String, Object>>>() {}); String type = (String) parameters.get("type"); @@ -155,12 +154,12 @@ List<Object> timeList = new ArrayList<Object>(); for (int i = 0; i < timeLength; i++) { - timeList.add(i, String.format("%02d", "day".equals(type) || "hour".equals(type) ? i : i + 1)); + timeList.add(String.format("%02d", "day".equals(type) || "hour".equals(type) ? i : i + 1)); } parameters.put("timeList", timeList); ExecutorService threadPool = Executors.newCachedThreadPool(); - CompletionService<Map<String, List<Object>>> cs = new ExecutorCompletionService<Map<String, List<Object>>>(threadPool); + CompletionService<Map<String, Object>> cs = new ExecutorCompletionService<Map<String, Object>>(threadPool); for (int i = 0; i < list.size(); i++) { Map<String, Object> map = list.get(i); map.put("part", i); @@ -169,9 +168,9 @@ } map.put("time", map.remove("formatTime")); map.putAll(parameters); - cs.submit(new Callable<Map<String, List<Object>>>() { + cs.submit(new Callable<Map<String, Object>>() { @Override - public Map<String, List<Object>> call() throws Exception { + public Map<String, Object> call() throws Exception { return getMonitorPointOrDeviceAvgData4Compare(map); } }); @@ -181,47 +180,83 @@ for (Map<String, Object> map : list) { dataList.add(cs.take().get()); } - Map[] maps = new HashMap[list.size()]; + Object[] datas = new Object[list.size()]; + Object[] deviceCounts = new Object[list.size()]; + Object[] alarmDatas = new Object[list.size()]; Set<String> sensors = new TreeSet<String>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return Integer.compare(Integer.valueOf(o1.split("-")[0].replace("e", "")), Integer.valueOf(o2.split("-")[0].replace("e", ""))); } }); + Map<String, Double> sortMap = new HashMap<String, Double>(); for (Object object : dataList) { Map<String, Object> map = (Map<String, Object>)object; for (String key : map.keySet()) { - if (key.startsWith("data")) { - int index = Integer.valueOf(key.replace("data", "")); - maps[index] = map; - } - if (key.startsWith("sensors")) { - sensors.addAll((List<String>) map.get(key)); + int index = Integer.valueOf(key.substring(key.length() - 1)); + String actual = key.substring(0, key.length() - 1); + Object obj = map.get(key); + switch (actual) { + case "data": + datas[index] = obj; + break; + case "deviceCount": + deviceCounts[index] = obj; + break; + case "alarmData": + alarmDatas[index] = obj; + if (!ObjectUtils.isEmpty(obj)) { + Map<String, BigDecimal> mapData = (Map<String, BigDecimal>) obj; + BigDecimal sum = mapData.remove("sum"); + for (Entry<String, BigDecimal> entry : mapData.entrySet()) { + if (!"name".equals(entry.getKey())) { + sortMap.put(entry.getKey() + "-" + index, new BigDecimal(100).multiply(entry.getValue()) + .divide(sum, 2, BigDecimal.ROUND_HALF_UP).doubleValue()); + + } + } + } + break; + case "sensors": + sensors.addAll((List<String>) obj); + break; } } } + List<Map.Entry<String, Double>> sortList = new ArrayList<Map.Entry<String,Double>>(sortMap.entrySet()); + Collections.sort(sortList,new Comparator<Map.Entry<String,Double>>(){ + @Override + public int compare(Entry<String, Double> o1, Entry<String, Double> o2) { + if (o2.getValue().compareTo(o1.getValue()) == 0) { + String[] key1 = o1.getKey().split("-"); + String[] key2 = o2.getKey().split("-"); + String sensor1 = key1[0].replace("e", ""); + String sensor2 = key2[0].replace("e", ""); + if (Integer.valueOf(sensor1).compareTo(Integer.valueOf(sensor2)) == 0) { + return Integer.compare(Integer.valueOf(key1[1]), Integer.valueOf(key2[1])); + } + return Integer.valueOf(sensor1).compareTo(Integer.valueOf(sensor2)); + } + return o2.getValue().compareTo(o1.getValue()); + } + + }); resultMap.put("times", timeList); - resultMap.put("datas", Arrays.asList(maps)); + resultMap.put("datas", Arrays.asList(datas)); + resultMap.put("deviceCounts", Arrays.asList(deviceCounts)); + resultMap.put("alarmDatas", Arrays.asList(alarmDatas)); resultMap.put("sensors", new ArrayList<Object>(sensors)); + resultMap.put("sortList", sortList); return resultMap; } - public Map<String, List<Object>> getMonitorPointOrDeviceAvgData4Compare(Map<String, Object> parameters) throws Exception { - Map<String, List<Object>> resultMap = new HashMap<String, List<Object>>(); - + public Map<String, Object> getMonitorPointOrDeviceAvgData4Compare(Map<String, Object> parameters) throws Exception { + Map<String, Object> resultMap = new HashMap<String, Object>(); List<Map<String, Object>> resultList = getMonitorPointOrDeviceAvgData(parameters); - List<Object> timeList = (List<Object>) parameters.get("timeList"); - - List<Object> dataList = new ArrayList<Object>(); - Set<String> sensors = new TreeSet<String>(new Comparator<String>() { - @Override - public int compare(String o1, String o2) { - return Integer.compare(Integer.valueOf(o1.split("-")[0].replace("e", "")), Integer.valueOf(o2.split("-")[0].replace("e", ""))); - } - }); - sensors.addAll((Set<String>)parameters.get("sensors")); + List<String> sensors = (List<String>) parameters.get("sensors"); + String part = parameters.get("part").toString(); Map<String, Double[]> doubleMap = new LinkedHashMap<String, Double[]>(); for (Map<String, Object> map : resultList) { String time = map.get("time").toString(); @@ -239,19 +274,37 @@ } doubles[index] = (Double) map.get(sensorKey); doubleMap.put(sensor, doubles); - } } } - dataList.add(doubleMap); - String part = parameters.get("part").toString(); - resultMap.put("data" + part, dataList); - resultMap.put("sensors" + part, new ArrayList<Object>(sensors)); + + Object deviceCount; + if (parameters.containsKey("deviceCount")) { + deviceCount = parameters.remove("deviceCount"); + } else { + deviceCount = deviceMapper.getDeviceCountByRegion(parameters); + } + + resultMap.put("deviceCount" + part, deviceCount); + resultMap.put("data" + part, doubleMap); + resultMap.put("sensors" + part, sensors); + Object type = parameters.get("type"); + if ("year".equals(type) || "month".equals(type)) { + parameters.put("sensorKeys", Arrays.asList("e1", "e2", "e10", "e11", "e15", "e16")); + resultMap.put("alarmData" + part, alarmDailyMapper.getAlarmData(parameters).get(0)); + } return resultMap; } @Override public List<Map<String, Object>> getMonitorPointOrDeviceAvgData(Map<String, Object> parameters) throws Exception { + convertQueryParam(parameters); + + return historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameters); + } + + @Override + public void convertQueryParam(Map<String, Object> parameters) throws ParseException { String type = (String) parameters.get("type"); if (!parameters.containsKey("field")) { parameters.putAll(getElementByType(type)); @@ -272,36 +325,36 @@ parameters.put("end", end); List<String> sensorKeys = new ArrayList<String>(); - Set<String> sensorsSet = new HashSet<String>(); + List<String> sensors = new ArrayList<String>(); if (parameters.containsKey("sensors")) { - List<String> sensors; try { - sensors = JSON.parseObject((String)parameters.remove("sensors"), new TypeReference<List<String>>() {}); + sensors = JSON.parseObject((String)parameters.get("sensors"), new TypeReference<List<String>>() {}); for (String sensor : sensors) { sensorKeys.add(sensor.split("-")[0]); } } catch (Exception e) { - sensors = (List<String>)parameters.remove("sensors"); - sensorKeys.addAll(sensors); + sensorKeys = sensors = (List<String>)parameters.remove("sensors"); } - sensorsSet.addAll(sensors); } else { - List<Sensor> sensors = sensorMapper.getSensorsByCriteria(parameters); - for (Sensor sensor : sensors) { + List<Sensor> sensorList = sensorMapper.getSensorsByCriteria(parameters); + for (Sensor sensor : sensorList) { sensorKeys.add(sensor.getSensorKey()); - sensorsSet.add(sensor.getSensorKey() + "-" + sensor.getName() + "-" + sensor.getUnit()); + String string = sensor.getSensorKey() + "-" + sensor.getName() + "-" + sensor.getUnit(); + if (parameters.containsKey("description")) { + string += "-" + sensor.getDescription(); + } + sensors.add(string); } } parameters.put("sensorKeys", sensorKeys); - parameters.put("sensors", sensorsSet); - - return historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameters); + parameters.put("sensors", sensors); } @Override public Map<String, Object> getMonthAverageBySensor(Map<String, Object> parameters) { - ValidateUtil.notNull(parameters.get("mac"), "param.is.null"); - ValidateUtil.notNull(parameters.get("macKey"), "param.is.null"); + //ValidateUtil.notNull(parameters.get("mac"), "param.is.null"); + Object sensorKey = parameters.remove("macKey"); + ValidateUtil.notNull(sensorKey, "param.is.null"); Map<String, Object> result = new HashMap<String, Object>(); LocalDate end = LocalDate.now(),start; // ��������������������������������������� @@ -314,10 +367,7 @@ } parameters.put("start", start); parameters.put("end", end); - String sensorKey = (String) parameters.remove("macKey"); - List<String> sensorKeys = new ArrayList<String>(); - sensorKeys.add(sensorKey); - parameters.put("sensorKeys", sensorKeys); + parameters.put("sensorKeys", Arrays.asList(sensorKey)); Map<String, Double> average = historyMinutelyMapper.getSersionAvgByDevice(parameters); if (isEmpty(average)) { -- Gitblit v1.8.0