package com.moral.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; 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 javax.annotation.Resource; import org.springframework.stereotype.Service; import com.moral.common.util.ValidateUtil; import com.moral.mapper.DeviceMapper; import com.moral.mapper.HistoryMapper; import com.moral.mapper.SensorMapper; import com.moral.service.AccountService; import com.moral.service.HistoryService; @Service public class HistoryServiceImpl implements HistoryService { @Resource private AccountService accountService; @Resource private HistoryMapper historyMapper; @Resource private DeviceMapper deviceMapper; @Resource private SensorMapper sensorMapper; @Override public Map getAllSensorAverageByDevice(Map parameters) throws Exception { ValidateUtil.notNull(parameters.get("areaCode"), "param.is.null"); ValidateUtil.notNull(parameters.get("accountId"), "param.is.null"); Map result = new HashMap(); Map resultMap = new HashMap(); accountService.setOrgIdsByAccount(parameters); LocalDateTime time = LocalDateTime.now(); // 当前时间 -10分钟 parameters.put("start", time.minusMinutes(10)); // 当前时间 -5分钟 parameters.put("end", time.minusMinutes(5)); parameters.put("macKey", "all"); List deviceVersionIds = deviceMapper.getDeviceVersionIdByAreaCode(parameters); ExecutorService threadPool = Executors.newCachedThreadPool(); CompletionService> cs = new ExecutorCompletionService>(threadPool); for (Integer deviceVersionId : deviceVersionIds) { Map parameter = new HashMap(parameters); String queryColumns = ""; List> sensors = sensorMapper.getSensorsByDeviceVersionId(deviceVersionId); for (int i = 0; i < sensors.size(); i++) { String sensorKey = (String) sensors.get(i).get("sensor_key"); queryColumns += "AVG(value -> '$." + sensorKey + "') " + sensorKey; if (i != sensors.size() - 1) { queryColumns += " ,"; } } parameter.put("queryColumns", queryColumns); parameter.put("deviceVersionId", deviceVersionId); cs.submit(new Callable>() { @Override public Map call() throws Exception { Map map = new HashMap(); List> list = historyMapper.getAreaAllDataByAccount(parameter); map.put(deviceVersionId.toString(), list.get(0)); return map; } }); } List> list = new ArrayList>(); for (Integer deviceVersionId : deviceVersionIds) { list.add(cs.take().get()); } for (Map map : list) { Collection values = map.values(); for (Object object : values) { Map result1 = (Map)object; for (String key : result1.keySet()) { Number[] numbers = new Number[2]; Double sum = (Double) result1.get(key); Integer count = 1; if (result.containsKey(key)) { numbers = result.get(key); sum += (Double)numbers[0]; count += (Integer)numbers[1]; } numbers[0] = sum; numbers[1] = count; result.put(key, numbers); resultMap.put(key, new BigDecimal(sum / count).setScale(3, RoundingMode.HALF_UP).doubleValue()); } } } return resultMap; /*Date date = new Date(); // 当前时间 -10分钟 parameters.put("start", DateUtils.addMinutes(date, -10)); // 当前时间 -5分钟 parameters.put("end", DateUtils.addMinutes(date, -5)); String queryColumns = ""; for (int i = 1; i < 20; i++) { if (i == 1) { queryColumns += "AVG(value -> '$.e" + i + "') e" + i; } else { queryColumns += " , AVG(value -> '$.e" + i + "') e" + i; } } parameters.put("queryColumns", queryColumns); parameters.put("macKey", "all"); List> list = historyMapper.getAreaAllDataByAccount(parameters); return list.get(0);*/ } @Override public Map getDeviceRankingBySensorAverage(Map parameters) { ValidateUtil.notNull(parameters.get("areaCode"), "param.is.null"); ValidateUtil.notNull(parameters.get("accountId"), "param.is.null"); ValidateUtil.notNull(parameters.get("macKey"), "param.is.null"); Map result = new LinkedHashMap(); accountService.setOrgIdsByAccount(parameters); LocalDateTime time = LocalDateTime.now(); // 当前时间 -1小时 parameters.put("start", time.minusHours(1)); parameters.put("end", time); parameters.put("macKey", "'$." + parameters.get("macKey") + "'"); List> list = historyMapper.getAreaAllDataByAccount(parameters); for (Map map : list) { result.put((String) map.get("name"), map.get("avg")); } return result; } }