工业级运维app手机api
xufenglei
2017-11-15 74bb3f9cc4761fd4204ce8b6479dd0024b422355
查询AQI接口采用多线程的方式
5 files modified
142 ■■■■ changed files
src/main/java/com/moral/monitor/controller/ReportController.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/monitor/dao/HistoryEntityMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/monitor/service/ScreenService.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/moral/monitor/service/impl/ScreenServiceImpl.java 117 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/HistoryEntityMapper.xml 12 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/monitor/controller/ReportController.java
@@ -39,6 +39,10 @@
            if (ObjectUtils.isEmpty(mac) || ObjectUtils.isEmpty(time) || ObjectUtils.isEmpty(type)) {
                result.put("msg", "参数不能为空!");
            } else {
                List<Map<String, Object>> sensorsAverage = reportService.getSensorsAverageByEquipment(parameters);
                if (ObjectUtils.isEmpty(sensorsAverage)) {
                    result.put("msg", "无有效数据");
                } else {
                String[][] exportColumn = new String[][] { 
                    new String[] { "时间", "20", "time" },
                    new String[] { "Pm2.5", "10", "e1" }, 
@@ -61,14 +65,9 @@
                    new String[] { "风速", "10", "e18" },
                    new String[] { "二氧化碳(CO2)", "10", "e19" }
                };
                List<Map<String, Object>> sensorsAverage = reportService.getSensorsAverageByEquipment(parameters);
                if (ObjectUtils.isEmpty(sensorsAverage)) {
                    result.put("msg", "无有效数据");
                } else {
                    OutputStream outputStream = ExportExcelUtils.exportData(response, time + "日" + "设备:" + mac + type + "数据", sensorsAverage, exportColumn);
                    outputStream.flush();
                    outputStream.close();
                    result.put("msg", "成功下载");
                }
            }
        } catch (BusinessException be) {
src/main/java/com/moral/monitor/dao/HistoryEntityMapper.java
@@ -14,7 +14,5 @@
    List<Map<String, Object>> getEquipmentStates(Map<String, Object> parameters); 
    String getMacLogByLast();
    List<Map<String, Object>> getSensorsAverageByEquipment(Map<String, Object> parameters);
}
src/main/java/com/moral/monitor/service/ScreenService.java
@@ -9,7 +9,7 @@
    List<AccountEntity> getAccountLists(String account, String password);
    Map<String, Object> getMonthDataByEquipment(Map<String, Object> parameters);
    Map<String, Object> getMonthDataByEquipment(Map<String, Object> parameters) throws Exception;
    Map<String, Object> getAverageByAll(Map<String, Object> parameters);
src/main/java/com/moral/monitor/service/impl/ScreenServiceImpl.java
@@ -9,6 +9,11 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
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 org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
@@ -16,7 +21,6 @@
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import com.alibaba.fastjson.JSON;
import com.moral.monitor.dao.AccountEntityMapper;
import com.moral.monitor.dao.HistoryEntityMapper;
import com.moral.monitor.entity.AccountEntity;
@@ -27,6 +31,7 @@
import com.moral.monitor.util.ResourceUtil;
@Service
@SuppressWarnings("unused")
public class ScreenServiceImpl implements ScreenService {
    @Autowired
@@ -44,53 +49,32 @@
        return accountMapper.selectByExample(example);
    }
    public Map<String, Object> getMonthDataByEquipment(Map<String, Object> parameters) {
    public Map<String, Object> getMonthDataByEquipment(final Map<String, Object> parameters) throws Exception {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        // 1.0 实际标准值
        resultMap.put("standard", ResourceUtil.getValue(parameters.get("macKey") + "-standard"));
        // 2.0 本月平均值
        // 2.0 AQI 指数
        Date date = new Date();
        // 每月一日的数据取上月的数据
        if (1 == Calendar.getInstance().get(Calendar.DAY_OF_MONTH)) {
            // 上个月1日00:00:00
            parameters.put("start", DateUtils.truncate(DateUtils.addMonths(date, -1), Calendar.MONTH));
        } else {
            // 这个月1日00:00:00
            parameters.put("start", DateUtils.truncate(date, Calendar.MONTH));
        }
        // 今日00:00:00
        parameters.put("end", DateUtils.truncate(date, Calendar.DATE));
        Map<String, Object> average = null;
        average = historyMapper.getMonthAverageBySensor(parameters);
        if (ObjectUtils.isEmpty(average)) {
            // 空值临时处理
            //resultMap.put("average", 50.3467 + Calendar.getInstance().get(Calendar.DAY_OF_MONTH) / 5);
            resultMap.put("average", "N/A");
        } else {
            //resultMap.putAll(average);
            //resultMap.put("average", String.format("%.2f", resultMap.get("average")));
            resultMap.put("average", String.format("%.2f", average.get("average")));
        }
        // 3.0 AQI 指数
        String[] macKeys = { "e1", "e2", "e10", "e11", "e15", "e16" };
        String[] IAQIValues = ResourceUtil.getArrValue("IAQI");
        List<Double> IAQIs = new ArrayList<Double>();
        // 昨日00:00:00
        parameters.put("start", DateUtils.truncate(DateUtils.addDays(date, -1), Calendar.DATE));
        for (String macKey : macKeys) {
        // 今日00:00:00
        parameters.put("end", DateUtils.truncate(date, Calendar.DATE));
        String[] macKeys = { "e1", "e2", "e10", "e11", "e15", "e16" };
        final String[] IAQIValues = ResourceUtil.getArrValue("IAQI");
        ExecutorService threadPool = Executors.newCachedThreadPool();
        CompletionService<Double> cs = new ExecutorCompletionService<Double>(threadPool);
        for (final String macKey : macKeys) {
            cs.submit(new Callable<Double>() {
                @Override
                public Double call() throws Exception {
                    Double result = null;
            double avg = 0, minMacKey = 0, maxMacKey = 0, minIAQI = 0, maxIAQI = 0;
            parameters.put("macKey", macKey);
            average = historyMapper.getMonthAverageBySensor(parameters);
            if (ObjectUtils.isEmpty(average)) {
                continue;
            } else {
                    Map<String, Object> map = new HashMap<String, Object>(parameters);
                    map.put("macKey", macKey);
                    Map<String, Object> average = historyMapper.getMonthAverageBySensor(map);
                    if (!ObjectUtils.isEmpty(average)) {
                avg = (Double) average.get("average");
            }
            String[] macKeyValues = ResourceUtil.getArrValue(macKey);
            int index = -1;
            for (int i = 0; i < macKeyValues.length; i++) {
@@ -104,26 +88,50 @@
                }
            }
            if (index == -1) {
                resultMap.put("AQI", IAQIValues[IAQIValues.length - 1]);
                break;
                            result = 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]);
                IAQIs.add(calculateIAQI(maxIAQI, minIAQI, maxMacKey, minMacKey, avg));
                            result = calculateIAQI(maxIAQI, minIAQI, maxMacKey, minMacKey, avg);
            }
                    }
                    return result;
                }
            });
        }
        
        if (!resultMap.containsKey("AQI")) {
        // 3.0 本月平均值
        Map<String, Object> average = null;
        Map<String, Object> map = new HashMap<String, Object>(parameters);
        // 每月一日的数据取上月的数据
        if (1 == Calendar.getInstance().get(Calendar.DAY_OF_MONTH)) {
            // 上个月1日00:00:00
            map.put("start", DateUtils.truncate(DateUtils.addMonths(date, -1), Calendar.MONTH));
        } else {
            // 这个月1日00:00:00
            map.put("start", DateUtils.truncate(date, Calendar.MONTH));
        }
        average = historyMapper.getMonthAverageBySensor(map);
        if (ObjectUtils.isEmpty(average)) {
            resultMap.put("average", "N/A");
        } else {
            resultMap.put("average", String.format("%.2f", average.get("average")));
        }
        List<Double> IAQIs = new ArrayList<Double>();
        for (String macKey : macKeys) {
            IAQIs.add(cs.take().get());
        }
            if (ObjectUtils.isEmpty(IAQIs)) {
                resultMap.put("AQI", "N/A");
            }else {
                double AQI = Collections.max(IAQIs);
                // 空值临时处理
                /*if (AQI == 0.0) {
                    AQI = 60.670;
                }*/
            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));
            }
        }
@@ -142,19 +150,6 @@
        // 当前时间 -5分钟
        parameters.put("end", DateUtils.addMinutes(date, -5));
        List<Map<String, Object>> averageByAll = historyMapper.getAverageByAll(parameters);
        // 临时方案,空值处理
        /*if (ObjectUtils.isEmpty(averageByAll)) {
            String macLog = historyMapper.getMacLogByLast();
            if (StringUtils.isNotBlank(macLog)) {
                Map<String, Object> map = JSON.parseObject(macLog);
                for (String key : map.keySet()) {
                    if (key.startsWith("e")) {
                        result.put(key, map.get(key));
                    }
                }
            }
        }*/
        for (Map<String, Object> map : averageByAll) {
            result.put((String) map.get("mac_key"), map.get("avg"));
src/main/resources/mapper/HistoryEntityMapper.xml
@@ -231,10 +231,10 @@
        FROM
            history
        WHERE
            mac = #{mac}
        AND mac_key = #{macKey}
        AND time &gt; #{start}
        AND time &lt; #{end}
            mac = #{mac,jdbcType=VARCHAR}
        AND mac_key = #{macKey,jdbcType=VARCHAR}
        AND time &gt; #{start,jdbcType=TIMESTAMP}
        AND time &lt; #{end,jdbcType=TIMESTAMP}
  </select>
    <select id="getAverageByAll" resultType="map">
@@ -287,10 +287,6 @@
            </foreach>
        </if>
        GROUP BY state
    </select>
    <select id="getMacLogByLast" resultType="string">
        SELECT mac_log FROM logger ORDER BY time DESC LIMIT 1
    </select>
    <select id="getSensorsAverageByEquipment" resultType="map">