|  |  |  | 
|---|
|  |  |  | package com.moral.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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.Arrays; | 
|---|
|  |  |  | import java.util.Calendar; | 
|---|
|  |  |  | import java.util.Collections; | 
|---|
|  |  |  | import java.util.Comparator; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | import java.util.concurrent.ExecutorService; | 
|---|
|  |  |  | import java.util.concurrent.Executors; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson.JSON; | 
|---|
|  |  |  | import com.alibaba.fastjson.TypeReference; | 
|---|
|  |  |  | import com.moral.common.util.CalculateUtils; | 
|---|
|  |  |  | 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.mapper.DeviceMapper; | 
|---|
|  |  |  | import com.moral.mapper.HistoryMinutelyMapper; | 
|---|
|  |  |  | import com.moral.mapper.SensorMapper; | 
|---|
|  |  |  | import com.moral.service.HistoryMinutelyService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Service | 
|---|
|  |  |  | @SuppressWarnings({ "unchecked", "rawtypes", "unused" }) | 
|---|
|  |  |  | public class HistoryMinutelyServiceImpl implements HistoryMinutelyService { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private HistoryMinutelyMapper historyMinutelyMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private DeviceMapper deviceMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private SensorMapper sensorMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // volatile | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, Object> getDayAQIByDevice(Map<String, Object> parameters) { | 
|---|
|  |  |  | 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" }; | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Map<String, Object> getAQIByDataMap(Map<String, Double> average) { | 
|---|
|  |  |  | Map<String, Object> resultMap = new HashMap<String, Object>(); | 
|---|
|  |  |  | if (isEmpty(average)) { | 
|---|
|  |  |  | resultMap.put("AQI", "N/V"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | String[] IAQIValues = ResourceUtil.getArrValue("IAQI"); | 
|---|
|  |  |  | Set<Double> IAQIs = new HashSet<Double>(); | 
|---|
|  |  |  | for (Map.Entry<String, Double> entry : average.entrySet()) { | 
|---|
|  |  |  | double minMacKey = 0, maxMacKey = 0, minIAQI = 0, maxIAQI = 0; | 
|---|
|  |  |  | String[] macKeyValues = ResourceUtil.getArrValue(entry.getKey()); | 
|---|
|  |  |  | Double avg = entry.getValue(); | 
|---|
|  |  |  | if (isEmpty(avg)) { | 
|---|
|  |  |  | IAQIs.add(null); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | int index = -1; | 
|---|
|  |  |  | for (int i = 0; i < macKeyValues.length; i++) { | 
|---|
|  |  |  | if (avg <= Double.valueOf(macKeyValues[i])) { | 
|---|
|  |  |  | if (i == 0) { | 
|---|
|  |  |  | index = i; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | index = i - 1; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (index == -1) { | 
|---|
|  |  |  | IAQIs.add(Double.MAX_VALUE); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | minMacKey = Double.valueOf(macKeyValues[index]); | 
|---|
|  |  |  | maxMacKey = Double.valueOf(macKeyValues[index + 1]); | 
|---|
|  |  |  | minIAQI = Double.valueOf(IAQIValues[index]); | 
|---|
|  |  |  | maxIAQI = Double.valueOf(IAQIValues[index + 1]); | 
|---|
|  |  |  | Double result = CalculateUtils.calculateIAQI(maxIAQI, minIAQI, maxMacKey, minMacKey, avg); | 
|---|
|  |  |  | IAQIs.add(result); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | IAQIs.remove(null); | 
|---|
|  |  |  | if (isEmpty(IAQIs)) { | 
|---|
|  |  |  | resultMap.put("AQI", "N/V"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Double AQI = Collections.max(IAQIs); | 
|---|
|  |  |  | if (AQI == Double.MAX_VALUE) { | 
|---|
|  |  |  | resultMap.put("AQI", IAQIValues[IAQIValues.length - 1]); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | resultMap.put("AQI", String.format("%.0f", AQI)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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>>(); | 
|---|
|  |  |  | List<Map<String, Object>> list = JSON.parseObject((String)parameters.remove("items"), new TypeReference<List<Map<String, Object>>>() {}); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String type = (String) parameters.get("type"); | 
|---|
|  |  |  | parameters.putAll(getElementByType(type)); | 
|---|
|  |  |  | Integer timeLength = Integer.valueOf(parameters.remove("timeLength").toString()); | 
|---|
|  |  |  | if ("month".equals(type)) { | 
|---|
|  |  |  | for (Map<String, Object> map : list) { | 
|---|
|  |  |  | String[] formatTime = map.get("formatTime").toString().split("-"); | 
|---|
|  |  |  | LocalDate localDate = LocalDate.of(Integer.valueOf(formatTime[0]), Integer.valueOf(formatTime[1]), 1); | 
|---|
|  |  |  | int lengthOfMonth = localDate.lengthOfMonth(); | 
|---|
|  |  |  | if (lengthOfMonth > timeLength) { | 
|---|
|  |  |  | timeLength = lengthOfMonth; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("timeList", timeList); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ExecutorService threadPool = Executors.newCachedThreadPool(); | 
|---|
|  |  |  | CompletionService<Map<String, List<Object>>> cs = new ExecutorCompletionService<Map<String, List<Object>>>(threadPool); | 
|---|
|  |  |  | for (int i = 0; i < list.size(); i++) { | 
|---|
|  |  |  | Map<String, Object> map = list.get(i); | 
|---|
|  |  |  | map.put("part", i); | 
|---|
|  |  |  | if (ObjectUtils.isEmpty(map.get("mac"))) { | 
|---|
|  |  |  | map.remove("mac"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put("time", map.remove("formatTime")); | 
|---|
|  |  |  | map.putAll(parameters); | 
|---|
|  |  |  | cs.submit(new Callable<Map<String, List<Object>>>() { | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, List<Object>> call() throws Exception { | 
|---|
|  |  |  | return getMonitorPointOrDeviceAvgData4Compare(map); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Object> dataList = new ArrayList<Object>(); | 
|---|
|  |  |  | for (Map<String, Object> map : list) { | 
|---|
|  |  |  | dataList.add(cs.take().get()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Map[] maps = new HashMap[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", ""))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | resultMap.put("times", timeList); | 
|---|
|  |  |  | resultMap.put("datas", Arrays.asList(maps)); | 
|---|
|  |  |  | resultMap.put("sensors", new ArrayList<Object>(sensors)); | 
|---|
|  |  |  | return resultMap; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Map<String, List<Object>> getMonitorPointOrDeviceAvgData4Compare(Map<String, Object> parameters) throws Exception { | 
|---|
|  |  |  | Map<String, List<Object>> resultMap = new HashMap<String, List<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")); | 
|---|
|  |  |  | Map<String, Double[]> doubleMap = new LinkedHashMap<String, Double[]>(); | 
|---|
|  |  |  | for (Map<String, Object> map : resultList) { | 
|---|
|  |  |  | String time = map.get("time").toString(); | 
|---|
|  |  |  | time = time.substring(time.length() - 2); | 
|---|
|  |  |  | int index = timeList.indexOf(time); | 
|---|
|  |  |  | for (String sensor : sensors) { | 
|---|
|  |  |  | String[] split = sensor.split("-"); | 
|---|
|  |  |  | String sensorKey = split[0]; | 
|---|
|  |  |  | if (map.containsKey(sensorKey)) { | 
|---|
|  |  |  | Double[] doubles; | 
|---|
|  |  |  | if (doubleMap.containsKey(sensor)) { | 
|---|
|  |  |  | doubles = doubleMap.get(sensor); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | doubles = new Double[timeList.size()]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | return resultMap; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<Map<String, Object>> getMonitorPointOrDeviceAvgData(Map<String, Object> parameters) throws Exception { | 
|---|
|  |  |  | List<Map<String, Object>> resultList ; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String type = (String) parameters.get("type"); | 
|---|
|  |  |  | if (!parameters.containsKey("field")) { | 
|---|
|  |  |  | parameters.putAll(getElementByType(type)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String time = (String) parameters.get("time"); | 
|---|
|  |  |  | String format = (String) parameters.get("format"); | 
|---|
|  |  |  | Integer field = Integer.valueOf(parameters.get("field").toString()); | 
|---|
|  |  |  | Date start = DateUtils.parseDate(time, format), end = null ; | 
|---|
|  |  |  | if (parameters.containsKey("timeb")) { | 
|---|
|  |  |  | end = DateUtils.parseDate((String)parameters.get("timeb"), format); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Calendar instance = Calendar.getInstance(); | 
|---|
|  |  |  | instance.setTime(start); | 
|---|
|  |  |  | instance.add(field, 1); | 
|---|
|  |  |  | end = instance.getTime(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("start", start); | 
|---|
|  |  |  | parameters.put("end", end); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (parameters.containsKey("sensorKey")) { | 
|---|
|  |  |  | List<String> sensors; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | sensors = JSON.parseObject((String)parameters.get("sensors"), new TypeReference<List<String>>() {}); | 
|---|
|  |  |  | parameters.put("sensors", new HashSet<String>(sensors)); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | sensors = new ArrayList<String>(); | 
|---|
|  |  |  | sensors.add((String)parameters.get("sensorKey")); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String sensorKeyColumn = ""; | 
|---|
|  |  |  | for (int i = 0; i < sensors.size(); i++) { | 
|---|
|  |  |  | String sensorKey = sensors.get(i).split("-")[0]; | 
|---|
|  |  |  | sensorKeyColumn += "AVG(json -> '$." + sensorKey + "[0]') " + sensorKey; | 
|---|
|  |  |  | if (i != sensors.size() - 1) { | 
|---|
|  |  |  | sensorKeyColumn += " ,"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("sensorKeyColumn", sensorKeyColumn); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //sensorKeys.clear(); | 
|---|
|  |  |  | // 监控点平均值 | 
|---|
|  |  |  | if (!parameters.containsKey("mac")) { | 
|---|
|  |  |  | resultList = new ArrayList<Map<String,Object>>(); | 
|---|
|  |  |  | Integer monitorPointId = Integer.valueOf(parameters.get("monitorPointId").toString()); | 
|---|
|  |  |  | 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<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 { | 
|---|
|  |  |  | Map<String, Object> parameter = new HashMap<String, Object>(parameters); | 
|---|
|  |  |  | Integer deviceVersionId = (Integer) map.get("deviceVersionId"); | 
|---|
|  |  |  | if (!parameter.containsKey("sensorKeyColumn")) { | 
|---|
|  |  |  | List<Map<String, Object>> sensors = sensorMapper.getSensorsByDeviceVersionId(deviceVersionId); | 
|---|
|  |  |  | String sensorKeyColumn = getSensorKeyColumnBySensors(sensors, parameters); | 
|---|
|  |  |  | parameter.put("sensorKeyColumn", sensorKeyColumn); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<String> macs = deviceMapper.getDeviceMacByMonitorPointAndDeviceVersion(monitorPointId, deviceVersionId); | 
|---|
|  |  |  | if (ObjectUtils.isEmpty(macs) || macs.contains("null") ) { | 
|---|
|  |  |  | return new ArrayList<Map<String,Object>>(); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | parameter.put("macs", macs); | 
|---|
|  |  |  | return historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameter); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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.remove("time"); | 
|---|
|  |  |  | Map<String, Number[]> times = new HashMap<String, Number[]>(); | 
|---|
|  |  |  | if (result.containsKey(time)) { | 
|---|
|  |  |  | times = (Map<String, Number[]>) result.get(time); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (Map.Entry<String,Object> entry  : map.entrySet()) { | 
|---|
|  |  |  | String sensorKey = entry.getKey(); | 
|---|
|  |  |  | Number[] doubles = new Number[3]; | 
|---|
|  |  |  | Double sum = (Double) entry.getValue(); | 
|---|
|  |  |  | Integer count = 1; | 
|---|
|  |  |  | if (times.containsKey(sensorKey)) { | 
|---|
|  |  |  | doubles = times.get(sensorKey); | 
|---|
|  |  |  | sum = (Double) doubles[0] + sum; | 
|---|
|  |  |  | count = (Integer) doubles[1] + 1; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | doubles[0] = sum; | 
|---|
|  |  |  | doubles[1] = count; | 
|---|
|  |  |  | doubles[2] = new BigDecimal(sum / count).setScale(3, RoundingMode.HALF_UP).doubleValue(); | 
|---|
|  |  |  | times.put(sensorKey, doubles); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | result.put(time, times); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Iterator<Entry<String, Map<String, Number[]>>> iterator = result.entrySet().iterator(); | 
|---|
|  |  |  | while(iterator.hasNext()){ | 
|---|
|  |  |  | Entry<String, Map<String, Number[]>> entry = iterator.next(); | 
|---|
|  |  |  | String resultTime = entry.getKey(); | 
|---|
|  |  |  | Map<String, Number[]> value = entry.getValue(); | 
|---|
|  |  |  | Map<String, Object> resultMap = new HashMap<String, Object>(); | 
|---|
|  |  |  | resultMap.put("time", resultTime); | 
|---|
|  |  |  | for (String sensorKey : value.keySet()) { | 
|---|
|  |  |  | resultMap.put(sensorKey, value.get(sensorKey)[2]); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | resultList.add(resultMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 设备 平均值 | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 所有传感器 | 
|---|
|  |  |  | if (!parameters.containsKey("sensorKeyColumn")) { | 
|---|
|  |  |  | String mac = (String) parameters.get("mac"); | 
|---|
|  |  |  | Device device = new Device(); | 
|---|
|  |  |  | device.setMac(mac); | 
|---|
|  |  |  | device = deviceMapper.selectOne(device); | 
|---|
|  |  |  | List<Map<String, Object>> sensors = sensorMapper.getSensorsByDeviceVersionId(device.getDeviceVersionId()); | 
|---|
|  |  |  | String sensorKeyColumn = getSensorKeyColumnBySensors(sensors,parameters); | 
|---|
|  |  |  | parameters.put("sensorKeyColumn", sensorKeyColumn); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | resultList = historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameters); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return resultList; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private String getSensorKeyColumnBySensors(List<Map<String, Object>> sensors,Map<String, Object> parameters) { | 
|---|
|  |  |  | String sensorKeyColumn = ""; | 
|---|
|  |  |  | Set<String> sensorKeys = new HashSet<String>(); | 
|---|
|  |  |  | if (parameters.containsKey("sensors")) { | 
|---|
|  |  |  | sensorKeys = (Set<String>) parameters.get("sensors"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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"); | 
|---|
|  |  |  | 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 ); | 
|---|
|  |  |  | parameters.put("sensors", sensorKeys); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 根据线性表单的条件规则,获取多条线性表单数据 | 
|---|
|  |  |  | * @param lineChartCriteria | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, List<List<Double>>> queryLineChartDateByCrieria(LineChartCriteria lineChartCriteria){ | 
|---|
|  |  |  | Map<String,List<List<Double>>> listMap = new HashMap<>(); | 
|---|
|  |  |  | List<String> sensorKeys = lineChartCriteria.getSensorKeys(); | 
|---|
|  |  |  | List<DataCondition> dataConditionList = lineChartCriteria.getDataConditions(); | 
|---|
|  |  |  | TimePeriod timePeriod = lineChartCriteria.getTimePeriod(); | 
|---|
|  |  |  | sensorKeys.forEach(sensorKey -> { | 
|---|
|  |  |  | listMap.put(sensorKey,new ArrayList<List<Double>>(dataConditionList.size())); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | dataConditionList.forEach(dataCondition -> { | 
|---|
|  |  |  | Map<String,List<Double>> dataMap =  queryOneLineChartDateByCrieria(sensorKeys,timePeriod,dataCondition); | 
|---|
|  |  |  | // 数据装载 | 
|---|
|  |  |  | listMap.forEach( (sensorKey,list) -> { | 
|---|
|  |  |  | List<Double> rowData = dataMap.get(sensorKey); | 
|---|
|  |  |  | list.add(rowData); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | return  listMap; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 根据线性表单的条件规则,获取一条线性表单数据,包含 所有检测项目 | 
|---|
|  |  |  | * @param sensorKeys | 
|---|
|  |  |  | * @param timePeriod | 
|---|
|  |  |  | * @param dataCondition | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public Map<String,List<Double>> queryOneLineChartDateByCrieria(List<String> sensorKeys, TimePeriod timePeriod, DataCondition dataCondition){ | 
|---|
|  |  |  | List<String> timeList = ReportTimeFormat.makeTimeList(timePeriod); | 
|---|
|  |  |  | List<Map<String,Object>> lineChartDatas = historyMinutelyMapper.selectLineChartDateByCrieria(sensorKeys,timePeriod,dataCondition); | 
|---|
|  |  |  | Map<String,List<Double>> lineChartDatasWithEmpty = new HashMap<>(); | 
|---|
|  |  |  | // lineChartDatasWithEmpty 初始化 | 
|---|
|  |  |  | sensorKeys.forEach(sensorKey -> { | 
|---|
|  |  |  | lineChartDatasWithEmpty.put(sensorKey,timeList.stream().map(time -> { | 
|---|
|  |  |  | Double data = null; | 
|---|
|  |  |  | return data; | 
|---|
|  |  |  | }).collect(Collectors.toList())); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | // m 为查询data的index,此处要防止m越界 | 
|---|
|  |  |  | int m = 0; | 
|---|
|  |  |  | int dataLength = lineChartDatas.size()-1; | 
|---|
|  |  |  | m = dataLength>-1?0:-1; | 
|---|
|  |  |  | if(m >-1){ | 
|---|
|  |  |  | for(int n =0;n<timeList.size();n++){ | 
|---|
|  |  |  | if(m>-1) { | 
|---|
|  |  |  | String time = timeList.get(n); | 
|---|
|  |  |  | Map<String,Object> rowData = lineChartDatas.get(m); | 
|---|
|  |  |  | String keyTime = rowData.get("format_time").toString(); | 
|---|
|  |  |  | if(time.equals(keyTime)){ | 
|---|
|  |  |  | // list to map | 
|---|
|  |  |  | int finalN = n; | 
|---|
|  |  |  | sensorKeys.forEach(sensorKey -> { | 
|---|
|  |  |  | Object value = rowData.get(sensorKey); | 
|---|
|  |  |  | List<Double> lineChartDatasWithEmptyTemp = lineChartDatasWithEmpty.get(sensorKey); | 
|---|
|  |  |  | if(finalN < lineChartDatasWithEmptyTemp.size()){ | 
|---|
|  |  |  | Double sensorValue = value!= null?new Double(value.toString()):null; | 
|---|
|  |  |  | lineChartDatasWithEmptyTemp.set(finalN,sensorValue); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | // 置为 -1,防止越界 | 
|---|
|  |  |  | m = m<dataLength ? m+1 : -1; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return  lineChartDatasWithEmpty; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Map<String, Object> getElementByType(Object type){ | 
|---|
|  |  |  | Map<String, Object> resultMap = new HashMap<String, Object>(); | 
|---|
|  |  |  | switch (type.toString()) { | 
|---|
|  |  |  | case "year": | 
|---|
|  |  |  | resultMap.put("format", "yyyy"); | 
|---|
|  |  |  | resultMap.put("typeFormat", "%Y-%m"); | 
|---|
|  |  |  | resultMap.put("timeLength", 12); | 
|---|
|  |  |  | resultMap.put("field", Calendar.YEAR); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "month": | 
|---|
|  |  |  | resultMap.put("format", "yyyy-MM"); | 
|---|
|  |  |  | resultMap.put("typeFormat", "%Y-%m-%d"); | 
|---|
|  |  |  | resultMap.put("timeLength", 28); | 
|---|
|  |  |  | resultMap.put("field", Calendar.MONTH); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "day": | 
|---|
|  |  |  | resultMap.put("format", "yyyy-MM-dd"); | 
|---|
|  |  |  | resultMap.put("typeFormat", "%Y-%m-%d %H"); | 
|---|
|  |  |  | resultMap.put("timeLength", 24); | 
|---|
|  |  |  | resultMap.put("field", Calendar.DATE); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "hour": | 
|---|
|  |  |  | resultMap.put("format", "yyyy-MM-dd HH"); | 
|---|
|  |  |  | resultMap.put("typeFormat", "%Y-%m-%d %H:%i"); | 
|---|
|  |  |  | resultMap.put("timeLength", 60); | 
|---|
|  |  |  | resultMap.put("field", Calendar.HOUR); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return resultMap; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | package com.moral.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.math.BigDecimal; | 
|---|
|  |  |  | import java.text.ParseException; | 
|---|
|  |  |  | import java.text.SimpleDateFormat; | 
|---|
|  |  |  | import java.time.Instant; | 
|---|
|  |  |  | import java.time.LocalDate; | 
|---|
|  |  |  | import java.time.LocalDateTime; | 
|---|
|  |  |  | import java.time.ZoneId; | 
|---|
|  |  |  | import java.time.ZonedDateTime; | 
|---|
|  |  |  | import java.time.format.DateTimeFormatter; | 
|---|
|  |  |  | import java.time.temporal.TemporalAdjusters; | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Arrays; | 
|---|
|  |  |  | import java.util.Calendar; | 
|---|
|  |  |  | import java.util.Collections; | 
|---|
|  |  |  | import java.util.Comparator; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | import java.util.concurrent.ExecutorService; | 
|---|
|  |  |  | import java.util.concurrent.Executors; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.annotation.Resource; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import org.apache.commons.collections.CollectionUtils; | 
|---|
|  |  |  | import org.apache.commons.lang3.time.DateUtils; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.util.ObjectUtils; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson.JSON; | 
|---|
|  |  |  | import com.alibaba.fastjson.TypeReference; | 
|---|
|  |  |  | import com.moral.common.util.CalculateUtils; | 
|---|
|  |  |  | import com.moral.common.util.ParameterUtils; | 
|---|
|  |  |  | import com.moral.common.util.ReportTimeFormat; | 
|---|
|  |  |  | import com.moral.common.util.ResourceUtil; | 
|---|
|  |  |  | import com.moral.common.util.ValidateUtil; | 
|---|
|  |  |  | import com.moral.entity.Area; | 
|---|
|  |  |  | import com.moral.entity.City; | 
|---|
|  |  |  | import com.moral.entity.MonitorPoint; | 
|---|
|  |  |  | import com.moral.entity.Province; | 
|---|
|  |  |  | 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.AreaMapper; | 
|---|
|  |  |  | import com.moral.mapper.CityMapper; | 
|---|
|  |  |  | import com.moral.mapper.DeviceMapper; | 
|---|
|  |  |  | import com.moral.mapper.HistoryMapper; | 
|---|
|  |  |  | import com.moral.mapper.HistoryMinutelyMapper; | 
|---|
|  |  |  | import com.moral.mapper.MonitorPointMapper; | 
|---|
|  |  |  | import com.moral.mapper.ProvinceMapper; | 
|---|
|  |  |  | import com.moral.mapper.SensorMapper; | 
|---|
|  |  |  | import com.moral.service.HistoryMinutelyService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import static com.moral.common.bean.Constants.NULL_VALUE; | 
|---|
|  |  |  | import static org.springframework.util.ObjectUtils.isEmpty; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Service | 
|---|
|  |  |  | @SuppressWarnings({"unchecked", "unused", "rawtypes"}) | 
|---|
|  |  |  | public class HistoryMinutelyServiceImpl implements HistoryMinutelyService { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private HistoryMinutelyMapper historyMinutelyMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private HistoryMapper historyMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private DeviceMapper deviceMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private SensorMapper sensorMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private AlarmDailyMapper alarmDailyMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private AreaMapper areaMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private ProvinceMapper provinceMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private CityMapper cityMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private MonitorPointMapper monitorPointMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, Object> getDayAQIByDevice(Map<String, Object> parameters) { | 
|---|
|  |  |  | //ValidateUtil.notNull(parameters.get("mac"), "param.is.null"); | 
|---|
|  |  |  | LocalDate time = LocalDate.now(); | 
|---|
|  |  |  | int year = time.getYear(); | 
|---|
|  |  |  | int month = time.getMonthValue(); | 
|---|
|  |  |  | int day = time.getDayOfMonth(); | 
|---|
|  |  |  | if (day == 1) { | 
|---|
|  |  |  | if (month == 1) { | 
|---|
|  |  |  | month = 12; | 
|---|
|  |  |  | year = year - 1; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | month = month - 1; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String monthStr = month < 10 ? ("0" + month) : month + ""; | 
|---|
|  |  |  | String yearAndMonth = year + monthStr; | 
|---|
|  |  |  | // 昨日00:00:00 | 
|---|
|  |  |  | parameters.put("start", time.minusDays(1)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 今日00:00:00 | 
|---|
|  |  |  | parameters.put("end", time); | 
|---|
|  |  |  | parameters.put("yearAndMonth", yearAndMonth); | 
|---|
|  |  |  | parameters.put("sensorKeys", Arrays.asList("e1", "e2", "e10", "e11", "e15", "e16")); | 
|---|
|  |  |  | Map<String, Double> average = historyMinutelyMapper.getSersionAvgByDevice(parameters); | 
|---|
|  |  |  | return getAQIByDataMap(average); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, Object> getHourAQIByDevice(Map<String, Object> parameters) { | 
|---|
|  |  |  | //ValidateUtil.notNull(parameters.get("mac"), "param.is.null"); | 
|---|
|  |  |  | LocalDate localDate = LocalDate.now(); | 
|---|
|  |  |  | // 昨日00:00:00 | 
|---|
|  |  |  | //parameters.put("start", localDate.minusDays(1)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Calendar calendar = Calendar.getInstance(); | 
|---|
|  |  |  | calendar.setTime(new Date()); | 
|---|
|  |  |  | calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) - 1); | 
|---|
|  |  |  | int hour = calendar.get(Calendar.HOUR) - 1; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 今日00:00:00 | 
|---|
|  |  |  | parameters.put("end", localDate); | 
|---|
|  |  |  | parameters.put("sensorKeys", Arrays.asList("e1", "e2", "e10", "e11", "e15", "e16")); | 
|---|
|  |  |  | Map<String, Double> average = historyMinutelyMapper.getSersionAvgByDevice(parameters); | 
|---|
|  |  |  | return getAQIByDataMap(average); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Map<String, Object> getAQIByDataMap(Map<String, Double> average) { | 
|---|
|  |  |  | Map<String, Object> resultMap = new HashMap<String, Object>(); | 
|---|
|  |  |  | if (isEmpty(average)) { | 
|---|
|  |  |  | resultMap.put("AQI", "N/V"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | String[] IAQIValues = ResourceUtil.getArrValue("IAQI"); | 
|---|
|  |  |  | Set<Double> IAQIs = new HashSet<Double>(); | 
|---|
|  |  |  | for (Map.Entry<String, Double> entry : average.entrySet()) { | 
|---|
|  |  |  | double minMacKey = 0, maxMacKey = 0, minIAQI = 0, maxIAQI = 0; | 
|---|
|  |  |  | String[] macKeyValues = ResourceUtil.getArrValue(entry.getKey()); | 
|---|
|  |  |  | Double avg = entry.getValue(); | 
|---|
|  |  |  | if (isEmpty(avg)) { | 
|---|
|  |  |  | IAQIs.add(null); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | int index = -1; | 
|---|
|  |  |  | for (int i = 0; i < macKeyValues.length; i++) { | 
|---|
|  |  |  | if (avg <= Double.valueOf(macKeyValues[i])) { | 
|---|
|  |  |  | if (i == 0) { | 
|---|
|  |  |  | index = i; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | index = i - 1; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (index == -1) { | 
|---|
|  |  |  | IAQIs.add(Double.MAX_VALUE); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | minMacKey = Double.valueOf(macKeyValues[index]); | 
|---|
|  |  |  | maxMacKey = Double.valueOf(macKeyValues[index + 1]); | 
|---|
|  |  |  | minIAQI = Double.valueOf(IAQIValues[index]); | 
|---|
|  |  |  | maxIAQI = Double.valueOf(IAQIValues[index + 1]); | 
|---|
|  |  |  | Double result = CalculateUtils.calculateIAQI(maxIAQI, minIAQI, maxMacKey, minMacKey, avg); | 
|---|
|  |  |  | IAQIs.add(result); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | IAQIs.remove(null); | 
|---|
|  |  |  | if (isEmpty(IAQIs)) { | 
|---|
|  |  |  | resultMap.put("AQI", "N/V"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Double AQI = Collections.max(IAQIs); | 
|---|
|  |  |  | if (AQI == Double.MAX_VALUE) { | 
|---|
|  |  |  | resultMap.put("AQI", IAQIValues[IAQIValues.length - 1]); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | resultMap.put("AQI", String.format("%.0f", AQI)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return resultMap; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | 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"); | 
|---|
|  |  |  | // parameters.putAll(getElementByType(type)); | 
|---|
|  |  |  | ParameterUtils.getElementByType(parameters); | 
|---|
|  |  |  | Integer timeLength = Integer.valueOf(parameters.remove("timeLength").toString()); | 
|---|
|  |  |  | if ("month".equals(type)) { | 
|---|
|  |  |  | for (Map<String, Object> map : list) { | 
|---|
|  |  |  | String[] formatTime = map.get("formatTime").toString().split("-"); | 
|---|
|  |  |  | LocalDate localDate = LocalDate.of(Integer.valueOf(formatTime[0]), Integer.valueOf(formatTime[1]), 1); | 
|---|
|  |  |  | int lengthOfMonth = localDate.lengthOfMonth(); | 
|---|
|  |  |  | if (lengthOfMonth > timeLength) { | 
|---|
|  |  |  | timeLength = lengthOfMonth; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Object> timeList = new ArrayList<Object>(); | 
|---|
|  |  |  | for (int i = 0; i < timeLength; i++) { | 
|---|
|  |  |  | 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, 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); | 
|---|
|  |  |  | if (ObjectUtils.isEmpty(map.get("mac"))) { | 
|---|
|  |  |  | map.remove("mac"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put("time", map.remove("formatTime")); | 
|---|
|  |  |  | map.putAll(parameters); | 
|---|
|  |  |  | cs.submit(new Callable<Map<String, Object>>() { | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, Object> call() throws Exception { | 
|---|
|  |  |  | return getMonitorPointOrDeviceAvgData4Compare(map); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Object> dataList = new ArrayList<Object>(); | 
|---|
|  |  |  | for (Map<String, Object> map : list) { | 
|---|
|  |  |  | dataList.add(cs.take().get()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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 o1.split("-")[0].compareTo(o2.split("-")[0]); | 
|---|
|  |  |  | //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()) { | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | if (key1[0].compareTo(key2[0]) == 0) { | 
|---|
|  |  |  | return Integer.compare(Integer.valueOf(key1[1]), Integer.valueOf(key2[1])); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return key1[0].compareTo(key2[0]); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return o2.getValue().compareTo(o1.getValue()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | resultMap.put("times", timeList); | 
|---|
|  |  |  | 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, 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<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(); | 
|---|
|  |  |  | time = time.substring(time.length() - 2); | 
|---|
|  |  |  | int index = timeList.indexOf(time); | 
|---|
|  |  |  | for (String sensor : sensors) { | 
|---|
|  |  |  | String[] split = sensor.split("-"); | 
|---|
|  |  |  | String sensorKey = split[0]; | 
|---|
|  |  |  | if (map.containsKey(sensorKey)) { | 
|---|
|  |  |  | Double[] doubles; | 
|---|
|  |  |  | if (doubleMap.containsKey(sensor)) { | 
|---|
|  |  |  | doubles = doubleMap.get(sensor); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | doubles = new Double[timeList.size()]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | doubles[index] = (Double) map.get(sensorKey); | 
|---|
|  |  |  | doubleMap.put(sensor, doubles); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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")); | 
|---|
|  |  |  | List<Map<String, Object>> alarmData = alarmDailyMapper.getAlarmData(parameters); | 
|---|
|  |  |  | if (!ObjectUtils.isEmpty(alarmData)) { | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | if (!ObjectUtils.isEmpty(parameters.get("compensate"))) { | 
|---|
|  |  |  | parameters.put("timeUnits", "10min"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameters); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void convertQueryParam(Map<String, Object> parameters) throws ParseException { | 
|---|
|  |  |  | if (!parameters.containsKey("field")) { | 
|---|
|  |  |  | // String type = (String) parameters.get("type"); | 
|---|
|  |  |  | // parameters.putAll(getElementByType(type)); | 
|---|
|  |  |  | ParameterUtils.getElementByType(parameters); | 
|---|
|  |  |  | if (parameters.containsKey("timeUnits")) { | 
|---|
|  |  |  | if ("minutely".equals(parameters.get("timeUnits"))) { | 
|---|
|  |  |  | if (parameters.containsKey("time")) { | 
|---|
|  |  |  | String[] timeStr = parameters.get("time").toString().split("-"); | 
|---|
|  |  |  | int year = Integer.valueOf(timeStr[0]); | 
|---|
|  |  |  | int month = Integer.valueOf(timeStr[1]); | 
|---|
|  |  |  | if (year >= 2020) { | 
|---|
|  |  |  | String yearAndMonth; | 
|---|
|  |  |  | if (month < 10) { | 
|---|
|  |  |  | yearAndMonth = "minutely_" + year + "0" + month; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | yearAndMonth = "minutely_" + year + month; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("timeUnits", yearAndMonth); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String time = (String) parameters.get("time"); | 
|---|
|  |  |  | String format = (String) parameters.get("format"); | 
|---|
|  |  |  | Integer field = Integer.valueOf(parameters.get("field").toString()); | 
|---|
|  |  |  | Date start = DateUtils.parseDate(time, format), end = null; | 
|---|
|  |  |  | if (parameters.containsKey("timeb")) { | 
|---|
|  |  |  | end = DateUtils.parseDate((String) parameters.get("timeb"), format); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | Calendar instance = Calendar.getInstance(); | 
|---|
|  |  |  | instance.setTime(start); | 
|---|
|  |  |  | instance.add(field, 1); | 
|---|
|  |  |  | end = instance.getTime(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("start", start); | 
|---|
|  |  |  | parameters.put("end", end); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<String> sensorKeys = new ArrayList<String>(); | 
|---|
|  |  |  | List<String> sensors = new ArrayList<String>(); | 
|---|
|  |  |  | if (parameters.containsKey("sensors")) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | sensors = JSON.parseObject((String) parameters.get("sensors"), new TypeReference<List<String>>() { | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | for (String sensor : sensors) { | 
|---|
|  |  |  | sensorKeys.add(sensor.split("-")[0]); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | sensorKeys = sensors = (List<String>) parameters.remove("sensors"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | List<Sensor> sensorList = sensorMapper.getSensorsByCriteria(parameters); | 
|---|
|  |  |  | for (Sensor sensor : sensorList) { | 
|---|
|  |  |  | sensorKeys.add(sensor.getSensorKey()); | 
|---|
|  |  |  | 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", sensors); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, Object> getMonthAverageBySensor(Map<String, Object> parameters) { | 
|---|
|  |  |  | //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; | 
|---|
|  |  |  | // 每月一日的数据取上月的数据 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | parameters.put("sensorKeys", Arrays.asList(sensorKey)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, Object> getAverageBySensor(Map<String, Object> parameters) { | 
|---|
|  |  |  | //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; | 
|---|
|  |  |  | // 每月一日的数据取上月的数据 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | parameters.put("sensorKeys", Arrays.asList(sensorKey)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Map<String, Double> average = historyMinutelyMapper.getAvgByDevice(parameters); | 
|---|
|  |  |  | if (isEmpty(average)) { | 
|---|
|  |  |  | result.put("average", NULL_VALUE); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | result.put("average", String.format("%.2f", average.get(sensorKey))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 根据线性表单的条件规则,获取多条线性表单数据 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param lineChartCriteria | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Map<String, List<List<Double>>> queryLineChartDateByCrieria(LineChartCriteria lineChartCriteria) { | 
|---|
|  |  |  | Map<String, List<List<Double>>> listMap = new HashMap<>(); | 
|---|
|  |  |  | List<String> sensorKeys = lineChartCriteria.getSensorKeys(); | 
|---|
|  |  |  | List<DataCondition> dataConditionList = lineChartCriteria.getDataConditions(); | 
|---|
|  |  |  | TimePeriod timePeriod = lineChartCriteria.getTimePeriod(); | 
|---|
|  |  |  | sensorKeys.forEach(sensorKey -> { | 
|---|
|  |  |  | listMap.put(sensorKey, new ArrayList<List<Double>>(dataConditionList.size())); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | dataConditionList.forEach(dataCondition -> { | 
|---|
|  |  |  | Map<String, List<Double>> dataMap = queryOneLineChartDateByCrieria(sensorKeys, timePeriod, dataCondition); | 
|---|
|  |  |  | // 数据装载 | 
|---|
|  |  |  | listMap.forEach((sensorKey, list) -> { | 
|---|
|  |  |  | List<Double> rowData = dataMap.get(sensorKey); | 
|---|
|  |  |  | list.add(rowData); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | return listMap; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 根据线性表单的条件规则,获取一条线性表单数据,包含 所有检测项目 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param sensorKeys | 
|---|
|  |  |  | * @param timePeriod | 
|---|
|  |  |  | * @param dataCondition | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public Map<String, List<Double>> queryOneLineChartDateByCrieria(List<String> sensorKeys, TimePeriod timePeriod, DataCondition dataCondition) { | 
|---|
|  |  |  | List<String> timeList = ReportTimeFormat.makeTimeList(timePeriod); | 
|---|
|  |  |  | Instant instant = timePeriod.getStartTime().toInstant(); | 
|---|
|  |  |  | ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault()); | 
|---|
|  |  |  | LocalDate localDate = zdt.toLocalDate(); | 
|---|
|  |  |  | int year = localDate.getYear(); | 
|---|
|  |  |  | int month = localDate.getMonthValue(); | 
|---|
|  |  |  | String timeUnits; | 
|---|
|  |  |  | if (year < 2020) { | 
|---|
|  |  |  | timeUnits = "minutely"; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | if (month < 10) { | 
|---|
|  |  |  | timeUnits = "minutely_" + year + "0" + month; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | timeUnits = "minutely_" + year + month; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Map<String, Object>> lineChartDatas = historyMinutelyMapper.selectLineChartDateByCrieria(sensorKeys, timePeriod, timeUnits, dataCondition); | 
|---|
|  |  |  | Map<String, List<Double>> lineChartDatasWithEmpty = new HashMap<>(); | 
|---|
|  |  |  | // lineChartDatasWithEmpty 初始化 | 
|---|
|  |  |  | sensorKeys.forEach(sensorKey -> { | 
|---|
|  |  |  | lineChartDatasWithEmpty.put(sensorKey, timeList.stream().map(time -> { | 
|---|
|  |  |  | Double data = null; | 
|---|
|  |  |  | return data; | 
|---|
|  |  |  | }).collect(Collectors.toList())); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | // m 为查询data的index,此处要防止m越界 | 
|---|
|  |  |  | int m = 0; | 
|---|
|  |  |  | int dataLength = lineChartDatas.size() - 1; | 
|---|
|  |  |  | m = dataLength > -1 ? 0 : -1; | 
|---|
|  |  |  | if (m > -1) { | 
|---|
|  |  |  | for (int n = 0; n < timeList.size(); n++) { | 
|---|
|  |  |  | if (m > -1) { | 
|---|
|  |  |  | String time = timeList.get(n); | 
|---|
|  |  |  | Map<String, Object> rowData = lineChartDatas.get(m); | 
|---|
|  |  |  | String keyTime = rowData.get("format_time").toString(); | 
|---|
|  |  |  | if (time.equals(keyTime)) { | 
|---|
|  |  |  | // list to map | 
|---|
|  |  |  | int finalN = n; | 
|---|
|  |  |  | sensorKeys.forEach(sensorKey -> { | 
|---|
|  |  |  | Object value = rowData.get(sensorKey); | 
|---|
|  |  |  | List<Double> lineChartDatasWithEmptyTemp = lineChartDatasWithEmpty.get(sensorKey); | 
|---|
|  |  |  | if (finalN < lineChartDatasWithEmptyTemp.size()) { | 
|---|
|  |  |  | Double sensorValue = value != null ? new Double(value.toString()) : null; | 
|---|
|  |  |  | lineChartDatasWithEmptyTemp.set(finalN, sensorValue); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | // 置为 -1,防止越界 | 
|---|
|  |  |  | m = m < dataLength ? m + 1 : -1; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return lineChartDatasWithEmpty; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Map<String, Object> getElementByType(Object type) { | 
|---|
|  |  |  | Map<String, Object> resultMap = new HashMap<String, Object>(); | 
|---|
|  |  |  | switch (type.toString()) { | 
|---|
|  |  |  | case "year": | 
|---|
|  |  |  | resultMap.put("format", "yyyy"); | 
|---|
|  |  |  | resultMap.put("typeFormat", "%Y-%m"); | 
|---|
|  |  |  | resultMap.put("timeLength", 12); | 
|---|
|  |  |  | resultMap.put("field", Calendar.YEAR); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "month": | 
|---|
|  |  |  | resultMap.put("format", "yyyy-MM"); | 
|---|
|  |  |  | resultMap.put("typeFormat", "%Y-%m-%d"); | 
|---|
|  |  |  | resultMap.put("timeLength", 28); | 
|---|
|  |  |  | resultMap.put("field", Calendar.MONTH); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "day": | 
|---|
|  |  |  | resultMap.put("format", "yyyy-MM-dd"); | 
|---|
|  |  |  | resultMap.put("typeFormat", "%Y-%m-%d %H"); | 
|---|
|  |  |  | resultMap.put("timeLength", 24); | 
|---|
|  |  |  | resultMap.put("field", Calendar.DATE); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "hour": | 
|---|
|  |  |  | resultMap.put("format", "yyyy-MM-dd HH"); | 
|---|
|  |  |  | resultMap.put("typeFormat", "%Y-%m-%d %H:%i"); | 
|---|
|  |  |  | resultMap.put("timeLength", 60); | 
|---|
|  |  |  | resultMap.put("field", Calendar.HOUR); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return resultMap; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * @description 查询无人机在时间段内的sensor值 | 
|---|
|  |  |  | * @author ZhuDongming | 
|---|
|  |  |  | * @date 2019-07-25 09:21:45 | 
|---|
|  |  |  | * @param parameters | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<List<Map<String, Object>>> getSensorData(Map<String, Object> parameters) { | 
|---|
|  |  |  | String startTime = parameters.get("startTime").toString(); | 
|---|
|  |  |  | DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); | 
|---|
|  |  |  | LocalDateTime startTimeLocalDateTime = LocalDateTime.parse(startTime, dateTimeFormatter); | 
|---|
|  |  |  | int year = startTimeLocalDateTime.getYear(); | 
|---|
|  |  |  | int month = startTimeLocalDateTime.getMonthValue(); | 
|---|
|  |  |  | String monthStr = month < 10 ? ("0" + month) : month + ""; | 
|---|
|  |  |  | String yearAndMonth = year + monthStr; | 
|---|
|  |  |  | List<Sensor> sensors = sensorMapper.getSensorsByMac(parameters); | 
|---|
|  |  |  | List<String> sensorKeys = new ArrayList<>(); | 
|---|
|  |  |  | for (Sensor sensor : sensors) { | 
|---|
|  |  |  | sensorKeys.add(sensor.getSensorKey()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("sensorKeys", sensorKeys); | 
|---|
|  |  |  | List<Map<String, Object>> listMap = null; | 
|---|
|  |  |  | if (year <= 2019) { | 
|---|
|  |  |  | listMap = historyMinutelyMapper.getSensorData(parameters); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | parameters.put("yearAndMonth", yearAndMonth); | 
|---|
|  |  |  | listMap = historyMinutelyMapper.getSensorData2020(parameters); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<List<Map<String, Object>>> listMaps = new ArrayList<>(); | 
|---|
|  |  |  | List<Map<String, Object>> listMapAvg = new ArrayList<>(); | 
|---|
|  |  |  | List<Map<String, Object>> listMapMin = new ArrayList<>(); | 
|---|
|  |  |  | List<Map<String, Object>> listMapMax = new ArrayList<>(); | 
|---|
|  |  |  | if (CollectionUtils.isNotEmpty(listMap)) { | 
|---|
|  |  |  | for (Map<String, Object> map : listMap) { | 
|---|
|  |  |  | Map<String, Object> mapAvg = new LinkedHashMap<>(); | 
|---|
|  |  |  | Map<String, Object> mapMin = new LinkedHashMap<>(); | 
|---|
|  |  |  | Map<String, Object> mapMax = new LinkedHashMap<>(); | 
|---|
|  |  |  | mapAvg.put("time", map.get("time")); | 
|---|
|  |  |  | mapMin.put("time", map.get("time")); | 
|---|
|  |  |  | mapMax.put("time", map.get("time")); | 
|---|
|  |  |  | for (Entry<String, Object> entry : map.entrySet()) { | 
|---|
|  |  |  | for (Sensor sensor : sensors) { | 
|---|
|  |  |  | if (sensor.getSensorKey().equals(entry.getKey())) { | 
|---|
|  |  |  | mapAvg.put(entry.getKey(), new BigDecimal(entry.getValue().toString()).stripTrailingZeros().toPlainString() + sensor.getUnit()); | 
|---|
|  |  |  | } else if (("min" + sensor.getSensorKey()).equals(entry.getKey())) { | 
|---|
|  |  |  | mapMin.put(entry.getKey().substring(3), new BigDecimal(entry.getValue().toString().replace("\"", "")).stripTrailingZeros().toPlainString()); | 
|---|
|  |  |  | } else if (("max" + sensor.getSensorKey()).equals(entry.getKey())) { | 
|---|
|  |  |  | mapMax.put(entry.getKey().substring(3), new BigDecimal(entry.getValue().toString().replace("\"", "")).stripTrailingZeros().toPlainString()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if ("0°".equals(mapAvg.get("e76")) || "0".equals(mapMin.get("e76")) || "0".equals(mapMax.get("e76")) || "0°".equals(mapAvg.get("e77")) || "0".equals(mapMin.get("e77")) || "0".equals(mapMax.get("e77"))) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | listMapAvg.add(mapAvg); | 
|---|
|  |  |  | listMapMin.add(mapMin); | 
|---|
|  |  |  | listMapMax.add(mapMax); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | listMaps.add(listMapAvg); | 
|---|
|  |  |  | listMaps.add(listMapMin); | 
|---|
|  |  |  | listMaps.add(listMapMax); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return listMaps; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<Map<String, Object>> getDevicesAvgDataToExcel(Map<String, Object> parameters) throws Exception { | 
|---|
|  |  |  | if ("month".equals(parameters.get("type"))) { | 
|---|
|  |  |  | parameters.put("timeUnits", "daily"); | 
|---|
|  |  |  | parameters.put("typeFormat", "%Y-%m-%d"); | 
|---|
|  |  |  | String time = parameters.get("time") + "-01T00:00:00"; | 
|---|
|  |  |  | LocalDateTime value = LocalDateTime.parse(time); | 
|---|
|  |  |  | LocalDateTime start = value.with(TemporalAdjusters.firstDayOfMonth()); | 
|---|
|  |  |  | LocalDateTime end = value.with(TemporalAdjusters.lastDayOfMonth()); | 
|---|
|  |  |  | parameters.put("start", start); | 
|---|
|  |  |  | parameters.put("end", end); | 
|---|
|  |  |  | int day = end.getDayOfMonth(); | 
|---|
|  |  |  | List<String> timeList = new ArrayList<>(); | 
|---|
|  |  |  | for (int i = 0; i <= day - 1; i++) { | 
|---|
|  |  |  | timeList.add(start.plusDays(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("timeList", timeList); | 
|---|
|  |  |  | } else if ("day".equals(parameters.get("type"))) { | 
|---|
|  |  |  | String time = parameters.get("time") + "T00:00:00"; | 
|---|
|  |  |  | LocalDateTime value = LocalDateTime.parse(time); | 
|---|
|  |  |  | LocalDateTime end = value.plusHours(23); | 
|---|
|  |  |  | parameters.put("timeUnits", "hourly"); | 
|---|
|  |  |  | parameters.put("typeFormat", "%Y-%m-%d %H:%i"); | 
|---|
|  |  |  | parameters.put("start", time); | 
|---|
|  |  |  | parameters.put("end", end); | 
|---|
|  |  |  | List<String> timeList = new ArrayList<>(); | 
|---|
|  |  |  | for (int i = 0; i <= 23; i++) { | 
|---|
|  |  |  | timeList.add(value.plusHours(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("timeList", timeList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return historyMinutelyMapper.getDevicesAvgDataToExcel(parameters); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<Map<String, Object>> getDevicesSensorsAvgDataToExcel(Map<String, Object> parameters) throws Exception { | 
|---|
|  |  |  | if ("month".equals(parameters.get("type"))) { | 
|---|
|  |  |  | parameters.put("timeUnits", "daily"); | 
|---|
|  |  |  | parameters.put("typeFormat", "%Y-%m-%d"); | 
|---|
|  |  |  | String time = parameters.get("time") + "-01T00:00:00"; | 
|---|
|  |  |  | LocalDateTime value = LocalDateTime.parse(time); | 
|---|
|  |  |  | LocalDateTime start = value.with(TemporalAdjusters.firstDayOfMonth()); | 
|---|
|  |  |  | LocalDateTime end = value.with(TemporalAdjusters.lastDayOfMonth()); | 
|---|
|  |  |  | parameters.put("start", start); | 
|---|
|  |  |  | parameters.put("end", end); | 
|---|
|  |  |  | int day = end.getDayOfMonth(); | 
|---|
|  |  |  | List<String> timeList = new ArrayList<>(); | 
|---|
|  |  |  | for (int i = 0; i <= day - 1; i++) { | 
|---|
|  |  |  | timeList.add(start.plusDays(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("timeList", timeList); | 
|---|
|  |  |  | } else if ("day".equals(parameters.get("type"))) { | 
|---|
|  |  |  | String time = parameters.get("time") + "T00:00:00"; | 
|---|
|  |  |  | LocalDateTime value = LocalDateTime.parse(time); | 
|---|
|  |  |  | LocalDateTime end = value.plusHours(23); | 
|---|
|  |  |  | parameters.put("timeUnits", "hourly"); | 
|---|
|  |  |  | parameters.put("typeFormat", "%Y-%m-%d %H:%i"); | 
|---|
|  |  |  | parameters.put("start", time); | 
|---|
|  |  |  | parameters.put("end", end); | 
|---|
|  |  |  | List<String> timeList = new ArrayList<>(); | 
|---|
|  |  |  | for (int i = 0; i <= 23; i++) { | 
|---|
|  |  |  | timeList.add(value.plusHours(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("timeList", timeList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return historyMinutelyMapper.getDevicesSensorsAvgDataToExcel(parameters); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<Map<String, Object>> get5MinutesOrHalfHour(Map<String, Object> parameters) throws ParseException { | 
|---|
|  |  |  | if (parameters.get("city") == null) { | 
|---|
|  |  |  | return new ArrayList<Map<String, Object>>(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String string = parameters.get("time").toString(); | 
|---|
|  |  |  | String year = string.substring(0, 4); | 
|---|
|  |  |  | String[] split = string.substring(5).split("-"); | 
|---|
|  |  |  | String month = split[0]; | 
|---|
|  |  |  | String day = split[1]; | 
|---|
|  |  |  | if (split[0].length() < 2) { | 
|---|
|  |  |  | month = 0 + split[0]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (split[1].length() < 2) { | 
|---|
|  |  |  | day = 0 + split[1]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String time = year + "-" + month + "-" + day; | 
|---|
|  |  |  | String cityName = parameters.get("city").toString(); | 
|---|
|  |  |  | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 
|---|
|  |  |  | String type = parameters.get("type").toString(); | 
|---|
|  |  |  | String range = parameters.get("range").toString(); | 
|---|
|  |  |  | Area area = areaMapper.getAreaByName(cityName); | 
|---|
|  |  |  | Integer code; | 
|---|
|  |  |  | String name; | 
|---|
|  |  |  | if (area == null) { | 
|---|
|  |  |  | City city = cityMapper.getCityByName(cityName); | 
|---|
|  |  |  | if (city == null) { | 
|---|
|  |  |  | Province province = provinceMapper.getProvinceByName(cityName); | 
|---|
|  |  |  | code = province.getProvinceCode(); | 
|---|
|  |  |  | name = province.getProvinceName(); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | code = city.getCityCode(); | 
|---|
|  |  |  | name = city.getCityName(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | code = area.getAreaCode(); | 
|---|
|  |  |  | name = area.getAreaName(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | parameters.put("cityCode", code); | 
|---|
|  |  |  | parameters.put("name", name); | 
|---|
|  |  |  | Map<String, Object> map = new HashMap<>(); | 
|---|
|  |  |  | if (code.toString().endsWith("0000")) { | 
|---|
|  |  |  | map.put("provinceCode", code); | 
|---|
|  |  |  | } else if (code.toString().endsWith("00")) { | 
|---|
|  |  |  | map.put("cityCode", code); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | map.put("areaCode", code); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //List<String> sensorKeys = sensorMapper.getSensorKeys(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<String> sensorKeys = new ArrayList<String>(); | 
|---|
|  |  |  | Collections.addAll(sensorKeys, "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e10", "e11", "e12", "e13", "e14", "e15" | 
|---|
|  |  |  | , "e16", "e17", "e18", "e21", "e23", "e25", "e26", "e27", "e28", "e31", "e33", "e45", "e49", "e97", "e98", "e102"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String timeUnits = "minutely_" + time.substring(0, 7).replace("-", ""); | 
|---|
|  |  |  | map.put("sensorKeys", sensorKeys); | 
|---|
|  |  |  | map.put("timeUnits", timeUnits); | 
|---|
|  |  |  | Calendar cal = Calendar.getInstance(); | 
|---|
|  |  |  | List<Map<String, Object>> resultList = new ArrayList<>(); | 
|---|
|  |  |  | int seg; | 
|---|
|  |  |  | long startTime; | 
|---|
|  |  |  | long endTime; | 
|---|
|  |  |  | int minuteChange; | 
|---|
|  |  |  | if ("m".equals(type)) { | 
|---|
|  |  |  | cal.setTime(sdf.parse(time + " 00:05:00")); | 
|---|
|  |  |  | startTime = cal.getTimeInMillis(); | 
|---|
|  |  |  | cal.add(Calendar.DAY_OF_MONTH, 1); | 
|---|
|  |  |  | endTime = cal.getTimeInMillis(); | 
|---|
|  |  |  | seg = 5 * 60 * 1000; | 
|---|
|  |  |  | minuteChange = -5; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | cal.setTime(sdf.parse(time + " 00:30:00")); | 
|---|
|  |  |  | startTime = cal.getTimeInMillis(); | 
|---|
|  |  |  | cal.add(Calendar.DAY_OF_MONTH, 1); | 
|---|
|  |  |  | endTime = cal.getTimeInMillis(); | 
|---|
|  |  |  | seg = 30 * 60 * 1000; | 
|---|
|  |  |  | minuteChange = -30; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (long time1 = startTime; time1 < endTime; time1 += seg) { | 
|---|
|  |  |  | Date end = new Date(time1); | 
|---|
|  |  |  | cal.setTime(end); | 
|---|
|  |  |  | cal.add(Calendar.MINUTE, minuteChange); | 
|---|
|  |  |  | Date start = cal.getTime(); | 
|---|
|  |  |  | map.put("start", start); | 
|---|
|  |  |  | map.put("end", end); | 
|---|
|  |  |  | Map<String, Object> dataMap = historyMinutelyMapper.get5MiutesOrHalfHourByDay(map); | 
|---|
|  |  |  | if (dataMap == null) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | dataMap.put("time", sdf.format(end)); | 
|---|
|  |  |  | dataMap.put("city", name); | 
|---|
|  |  |  | Set<String> set = dataMap.keySet(); | 
|---|
|  |  |  | Iterator<String> it = set.iterator(); | 
|---|
|  |  |  | List<String> listKey = new ArrayList<>(); | 
|---|
|  |  |  | while (it.hasNext()) { | 
|---|
|  |  |  | String key = it.next(); | 
|---|
|  |  |  | if (dataMap.get(key) == null || "".equals(dataMap.get(key))) { | 
|---|
|  |  |  | listKey.add(key); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (String key : listKey) { | 
|---|
|  |  |  | dataMap.remove(key); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | resultList.add(dataMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return resultList; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|