From 5b0347a811a6c948defb5320e71c43173280dfc2 Mon Sep 17 00:00:00 2001 From: xufenglei <xufenglei> Date: Tue, 06 Feb 2018 10:30:31 +0800 Subject: [PATCH] 更新 --- src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java | 169 +++++++++++++++++++++----------------------------------- 1 files changed, 63 insertions(+), 106 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..d2b440c 100644 --- a/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java +++ b/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java @@ -1,9 +1,13 @@ package com.moral.service.impl; +import static com.moral.common.bean.Constants.NULL_VALUE; import static org.apache.commons.lang3.time.DateUtils.addDays; +import static org.apache.commons.lang3.time.DateUtils.addMonths; import static org.apache.commons.lang3.time.DateUtils.truncate; import static org.springframework.util.ObjectUtils.isEmpty; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; @@ -26,9 +30,13 @@ import javax.annotation.Resource; import org.apache.commons.lang3.time.DateUtils; +import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.aggregation.AggregationResults; +import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; +import com.mongodb.BasicDBObject; import com.moral.common.util.CalculateUtils; import com.moral.common.util.ResourceUtil; import com.moral.common.util.ValidateUtil; @@ -60,7 +68,16 @@ parameters.put("start", truncate(addDays(date, -1), Calendar.DATE)); // ������00:00:00 parameters.put("end", truncate(date, Calendar.DATE)); - Map<String, Double> average = historyMinutelyMapper.getDayAQIByDevice(parameters); + 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,107 +133,13 @@ return resultMap; } - public Map<String, List<Object>> getMonitorPointOrDeviceAvgData(Map<String, Object> parameters) throws Exception { + 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 = 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<Map<String, Object>> resultList = getMonitorPointOrDeviceAvgData(parameters); List<Object> timeList = new ArrayList<Object>(); List<Object> dataList = new ArrayList<Object>(); @@ -262,7 +185,7 @@ cs.submit(new Callable<Map<String, List<Object>>>() { @Override public Map<String, List<Object>> call() throws Exception { - return getMonitorPointOrDeviceAvgData(map); + return getMonitorPointOrDeviceAvgData4Compare(map); } }); @@ -315,7 +238,7 @@ @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 +273,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 +327,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 +344,9 @@ } resul.add(resultMap); } - + // ������ ��������� } else { + // ��������������� if (!parameters.containsKey("sensorKeyColumn")) { String mac = (String) parameters.get("mac"); Device device = new Device(); @@ -439,17 +365,48 @@ 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 + ","; - } + sensorKeyColumn += "AVG(json -> '$." + sensorKey + "[0]') " + sensorKey; + if (i != sensors.size() - 1) { + sensorKeyColumn += " ,"; + } sensorKeys.add(sensorKey + "-" + name); } 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>(); + Date date = new Date(); + Date end = truncate(date, Calendar.DATE), start; + // ��������������������������������������� + if (1 == Calendar.getInstance().get(Calendar.DAY_OF_MONTH)) { + // ���������1���00:00:00 + start = truncate(addMonths(date, -1), Calendar.MONTH); + } else { + // ���������1���00:00:00 + start = truncate(date, Calendar.MONTH); + } + 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