From fbec1c270bfbeac936035cbc9db61d8a1162ccf9 Mon Sep 17 00:00:00 2001 From: xufenglei <xufenglei> Date: Mon, 05 Mar 2018 10:35:27 +0800 Subject: [PATCH] 报表优化 --- src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java | 268 ++++++++++++++++++++++++++--------------------------- 1 files changed, 133 insertions(+), 135 deletions(-) diff --git a/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java b/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java index 8ede45f..7b1e57a 100644 --- a/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java +++ b/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java @@ -1,11 +1,13 @@ package com.moral.service.impl; -import static org.apache.commons.lang3.time.DateUtils.addDays; -import static org.apache.commons.lang3.time.DateUtils.truncate; +import static com.moral.common.bean.Constants.NULL_VALUE; import static org.springframework.util.ObjectUtils.isEmpty; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -17,6 +19,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutorCompletionService; @@ -33,8 +36,9 @@ import com.moral.common.util.ResourceUtil; import com.moral.common.util.ValidateUtil; import com.moral.entity.Device; -import com.moral.mapper.HistoryMinutelyMapper; +import com.moral.entity.Sensor; import com.moral.mapper.DeviceMapper; +import com.moral.mapper.HistoryMinutelyMapper; import com.moral.mapper.SensorMapper; import com.moral.service.HistoryMinutelyService; @@ -50,17 +54,28 @@ @Resource private SensorMapper sensorMapper; + // volatile private Set<String> sensorKeys = new HashSet<String>(); @Override public Map<String, Object> getDayAQIByDevice(Map<String, Object> parameters) { ValidateUtil.notNull(parameters.get("mac"), "param.is.null"); - Date date = new Date(); + LocalDate localDate = LocalDate.now(); // ������00:00:00 - parameters.put("start", truncate(addDays(date, -1), Calendar.DATE)); + parameters.put("start", localDate.minusDays(1)); + // ������00:00:00 - parameters.put("end", truncate(date, Calendar.DATE)); - Map<String, Double> average = historyMinutelyMapper.getDayAQIByDevice(parameters); + parameters.put("end", localDate); + String[] macKeys = { "e1", "e2", "e10", "e11", "e15", "e16" }; + String sensorKeyColumn = ""; + for (int i = 0; i < macKeys.length; i++) { + sensorKeyColumn += "AVG(json -> '$." + macKeys[i] + "[0]') " + macKeys[i]; + if (i != macKeys.length -1) { + sensorKeyColumn += " ,"; + } + } + parameters.put("sensorKeyColumn", sensorKeyColumn); + Map<String, Double> average = historyMinutelyMapper.getSersionAvgByDevice(parameters); return getAQIByDataMap(average); } @@ -116,123 +131,6 @@ return resultMap; } - public Map<String, List<Object>> getMonitorPointOrDeviceAvgData(Map<String, Object> parameters) throws Exception { - Map<String, List<Object>> resultMap = new HashMap<String, List<Object>>(); - if (ObjectUtils.isEmpty(parameters)) { - resultMap.put("c", null); - return resultMap; - } - List<Map<String, Object>> resultList = getMonitorPointOrDeviceAvgData4Excel(parameters); -// String type = (String) parameters.get("type"); -// String time = (String) parameters.get("time"); -// String format = (String) parameters.get("format"); -// Date start = DateUtils.parseDate(time, format), end = null ; -// if (parameters.containsKey("timeb")) { -// end = DateUtils.parseDate((String)parameters.get("timeb"), format); -// } else { -// switch (type) { -// case "year": -// end = DateUtils.addYears(start, 1); -// break; -// case "month": -// end = DateUtils.addMonths(start, 1); -// break; -// case "day": -// end = DateUtils.addDays(start, 1); -// break; -// case "hour": -// end = DateUtils.addHours(start, 1); -// break; -// } -// -// } -// parameters.put("start", start); -// parameters.put("end", end); -// -// String sensorKey = (String) parameters.get("sensorKey"); -// String sensorKeyColumn = "AVG(json -> '$." + sensorKey + "[0]') " + sensorKey; -// parameters.put("sensorKeyColumn", sensorKeyColumn); -// List<Object> timeList = new ArrayList<Object>(); -// List<Object> dataList = new ArrayList<Object>(); -// -// if (!parameters.containsKey("mac")) { -// Integer monitorPointId = Integer.valueOf((String) parameters.get("monitorPoint")); -// List<Map<String, Object>> deviceVersions = deviceMapper.getDeviceVersionIdByMonitorPoint(monitorPointId); -// ExecutorService threadPool = Executors.newCachedThreadPool(); -// CompletionService<List<Map<String, Object>>> cs = new ExecutorCompletionService<List<Map<String, Object>>>(threadPool); -// //List<Future<Long>> list = new ArrayList<Future<Long>>(); -// List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); -// for (Map<String, Object> map : deviceVersions) { -// cs.submit(new Callable<List<Map<String, Object>>>() { -// @Override -// public List<Map<String, Object>> call() throws Exception { -// Integer deviceVersionId = (Integer) map.get("deviceVersionId"); -// List<String> macs = deviceMapper.getDeviceMacByMonitorPointAndDeviceVersion(monitorPointId, deviceVersionId); -// parameters.put("macs", macs); -// return historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameters); -// } -// }); -// } -// //Future<List<Map<String, Object>>> take = cs.take(); -// for (Map<String, Object> map : deviceVersions) { -// list.addAll(cs.take().get()); -// } -// Map<String, Map<String, Number>> result = new LinkedHashMap<String, Map<String, Number>>(); -// for (Map<String, Object> map : list) { -// time = (String) map.get("time"); -// if (map.containsKey(sensorKey)) { -// Double data = (Double) map.get(sensorKey); -// Map<String, Number> number; -// Double sum; -// Integer count; -// if (result.containsKey(time)) { -// number = result.get(time); -// count = 1 + (Integer) number.get("count"); -// sum = data + (Double) number.get("sum"); -// } else { -// number = new HashMap<String, Number>(); -// count = 1; -// sum = data; -// } -// number.put("count", count); -// number.put("sum", sum); -// number.put("avg", sum / count); -// result.put(time, number); -// } -// } -// Iterator<Entry<String, Map<String, Number>>> iterator= result.entrySet().iterator(); -// while(iterator.hasNext()){ -// Entry<String, Map<String, Number>> entry = iterator.next(); -// String key = entry.getKey(); -// timeList.add(key.substring(key.length() - 2)); -// dataList.add(entry.getValue().get("avg")); -// } -// -// } else { -// List<Map<String, Object>> demo1 = historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameters); -// for (Map<String, Object> map : demo1) { -// time = map.get("time").toString(); -// time =time.substring(time.length() - 2); -// timeList.add(time); -// dataList.add(map.get(sensorKey)); -// } -// } - - List<Object> timeList = new ArrayList<Object>(); - List<Object> dataList = new ArrayList<Object>(); - String sensorKey = (String) parameters.get("sensorKey"); - for (Map<String, Object> map : resultList) { - String time = map.get("time").toString(); - time =time.substring(time.length() - 2); - timeList.add(time); - dataList.add(map.get(sensorKey)); - } - String part = (String) parameters.get("part"); - resultMap.put("time" + part, timeList); - resultMap.put("data" + part, dataList); - return resultMap; - } - @Override public Map<String, List<Object>> getCompareReport(Map<String, Object> parameters) throws Exception { Map<String, List<Object>> resultMap = new HashMap<String, List<Object>>(); @@ -262,7 +160,7 @@ cs.submit(new Callable<Map<String, List<Object>>>() { @Override public Map<String, List<Object>> call() throws Exception { - return getMonitorPointOrDeviceAvgData(map); + return getMonitorPointOrDeviceAvgData4Compare(map); } }); @@ -314,8 +212,75 @@ } + public Map<String, List<Object>> getMonitorPointOrDeviceAvgData4Compare(Map<String, Object> parameters) throws Exception { + Map<String, List<Object>> resultMap = new HashMap<String, List<Object>>(); + if (ObjectUtils.isEmpty(parameters)) { + resultMap.put("c", null); + return resultMap; + } + List<Map<String, Object>> resultList = getMonitorPointOrDeviceAvgData(parameters); + + List<Object> timeList = new ArrayList<Object>(); + List<Object> dataList = new ArrayList<Object>(); + Set<String> sensors ; + if (parameters.containsKey("sensorKey")) { + String sensorKey = (String) parameters.get("sensorKey"); +// Map<String, List<Double>> doubleMap = new HashMap<String, List<Double>>(); +// List<Double> doubles = new ArrayList<Double>(); +// for (Map<String, Object> map : resultList) { +// String time = map.get("time").toString(); +// time =time.substring(time.length() - 2); +// timeList.add(time); +// // dataList.add(map.get(sensorKey)); +// doubles.add((Double) map.get(sensorKey)); +// } +// doubleMap.put(sensorKey, doubles); +// dataList.add(doubleMap); + Sensor sensor = new Sensor(); + sensor.setSensorKey(sensorKey); + sensor = sensorMapper.selectOne(sensor ); + sensors = new HashSet<String>(); + sensors.add(sensorKey + "-" + sensor.getName() + "-" + sensor.getUnit()); + } else { + 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")); + } + Map<String, List<Double>> doubleMap = new LinkedHashMap<String, List<Double>>(); + for (Map<String, Object> map : resultList) { + String time = map.get("time").toString(); + time =time.substring(time.length() - 2); + timeList.add(time); + for (String sensor : sensors) { + String[] split = sensor.split("-"); + String sensorKey = split[0]; + if (map.containsKey(sensorKey)) { + List<Double> doubles; + if (doubleMap.containsKey(sensor)) { + doubles = doubleMap.get(sensor); + } else { + doubles = new ArrayList<Double>(); + } + doubles.add((Double) map.get(sensorKey)); + doubleMap.put(sensor, doubles); + + } + //dataList.add(map.get(sensorKey)); + } + } + dataList.add(doubleMap); + String part = (String) parameters.get("part"); + resultMap.put("time" + part, timeList); + resultMap.put("data" + part, dataList); + return resultMap; + } + @Override - public List<Map<String, Object>> getMonitorPointOrDeviceAvgData4Excel(Map<String, Object> parameters) throws Exception { + public List<Map<String, Object>> getMonitorPointOrDeviceAvgData(Map<String, Object> parameters) throws Exception { List<Map<String, Object>> resul ; String type = (String) parameters.get("type"); @@ -350,6 +315,8 @@ parameters.put("sensorKeyColumn", sensorKeyColumn); } + sensorKeys.clear(); + // ������������������ if (!parameters.containsKey("mac")) { resul = new ArrayList<Map<String,Object>>(); Integer monitorPointId = Integer.valueOf((String) parameters.get("monitorPoint")); @@ -402,7 +369,7 @@ } doubles[0] = sum; doubles[1] = count; - doubles[2] = (sum / count); + doubles[2] = new BigDecimal(sum / count).setScale(3, RoundingMode.HALF_UP).doubleValue(); times.put(sensorKey, doubles); } result.put(time, times); @@ -419,8 +386,9 @@ } resul.add(resultMap); } - + // ������ ��������� } else { + // ��������������� if (!parameters.containsKey("sensorKeyColumn")) { String mac = (String) parameters.get("mac"); Device device = new Device(); @@ -439,17 +407,47 @@ private String getSensorKeyColumnBySensors(List<Map<String, Object>> sensors) { String sensorKeyColumn = ""; + for (int i = 0; i < sensors.size(); i++) { String sensorKey = (String) sensors.get(i).get("sensor_key"); String name = (String) sensors.get(i).get("name"); - if (i == sensors.size() - 1) { - sensorKeyColumn += "AVG(json -> '$." + sensorKey + "[0]') " + sensorKey; - } else { - sensorKeyColumn += "AVG(json -> '$." + sensorKey + "[0]') " + sensorKey + ","; - } - sensorKeys.add(sensorKey + "-" + name); + String unit = (String) sensors.get(i).get("unit"); + sensorKeyColumn += "AVG(json -> '$." + sensorKey + "[0]') " + sensorKey; + if (i != sensors.size() - 1) { + sensorKeyColumn += " ,"; + } + sensorKeys.add(sensorKey + "-" + name + "-" + unit ); } return sensorKeyColumn; } + @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"); + Map<String, Object> result = new HashMap<String, Object>(); + LocalDate end = LocalDate.now(),start; + // ��������������������������������������� + if (1 == end.getDayOfMonth()) { + // ���������1���00:00:00 + start = end.plusDays(-1).with(TemporalAdjusters.firstDayOfMonth()); + } else { + // ���������1���00:00:00 + start = end.with(TemporalAdjusters.firstDayOfMonth()); + } + parameters.put("start", start); + parameters.put("end", end); + String sensorKey = (String) parameters.get("macKey"); + String sensorKeyColumn = "AVG(json -> '$." + sensorKey + "[0]') " + sensorKey; + parameters.put("sensorKeyColumn", sensorKeyColumn); + + Map<String, Double> average = historyMinutelyMapper.getSersionAvgByDevice(parameters); + if (isEmpty(average)) { + result.put("average", NULL_VALUE); + } else { + result.put("average", String.format("%.2f", average.get(sensorKey))); + } + return result; + } + } -- Gitblit v1.8.0