From 74bb3f9cc4761fd4204ce8b6479dd0024b422355 Mon Sep 17 00:00:00 2001
From: xufenglei <xufenglei>
Date: Wed, 15 Nov 2017 09:46:36 +0800
Subject: [PATCH] 查询AQI接口采用多线程的方式
---
src/main/java/com/moral/monitor/controller/ReportController.java | 45 +++++-----
src/main/java/com/moral/monitor/service/impl/ScreenServiceImpl.java | 143 +++++++++++++++++------------------
src/main/resources/mapper/HistoryEntityMapper.xml | 12 +--
src/main/java/com/moral/monitor/dao/HistoryEntityMapper.java | 2
src/main/java/com/moral/monitor/service/ScreenService.java | 2
5 files changed, 96 insertions(+), 108 deletions(-)
diff --git a/src/main/java/com/moral/monitor/controller/ReportController.java b/src/main/java/com/moral/monitor/controller/ReportController.java
index 509ad8b..54a855b 100644
--- a/src/main/java/com/moral/monitor/controller/ReportController.java
+++ b/src/main/java/com/moral/monitor/controller/ReportController.java
@@ -39,36 +39,35 @@
if (ObjectUtils.isEmpty(mac) || ObjectUtils.isEmpty(time) || ObjectUtils.isEmpty(type)) {
result.put("msg", "���������������������");
} else {
- String[][] exportColumn = new String[][] {
- new String[] { "������", "20", "time" },
- new String[] { "Pm2.5", "10", "e1" },
- new String[] { "Pm10", "20", "e2" },
- new String[] { "0.1���0.3um���", "30", "e3" },
- new String[] { "0.1���2.5um���", "10", "e4" },
- new String[] { "������", "10", "e5" },
- new String[] { "������", "10", "e6" },
- new String[] { "������", "10", "e7" },
- new String[] { "������(O2)", "10", "e8" },
- new String[] { "������(CL2)", "10", "e9" },
- new String[] { "������������(CO)", "10", "e10" },
- new String[] { "������������(SO2)", "10", "e11" },
- new String[] { "������", "10", "e12" },
- new String[] { "������", "10", "e13" },
- new String[] { "������(NH3)", "10", "e14" },
- new String[] { "������(O3)", "10", "e15" },
- new String[] { "������������(NO2)", "10", "e16" },
- new String[] { "���������������������", "10", "e17" },
- 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 {
+ String[][] exportColumn = new String[][] {
+ new String[] { "������", "20", "time" },
+ new String[] { "Pm2.5", "10", "e1" },
+ new String[] { "Pm10", "20", "e2" },
+ new String[] { "0.1���0.3um���", "30", "e3" },
+ new String[] { "0.1���2.5um���", "10", "e4" },
+ new String[] { "������", "10", "e5" },
+ new String[] { "������", "10", "e6" },
+ new String[] { "������", "10", "e7" },
+ new String[] { "������(O2)", "10", "e8" },
+ new String[] { "������(CL2)", "10", "e9" },
+ new String[] { "������������(CO)", "10", "e10" },
+ new String[] { "������������(SO2)", "10", "e11" },
+ new String[] { "������", "10", "e12" },
+ new String[] { "������", "10", "e13" },
+ new String[] { "������(NH3)", "10", "e14" },
+ new String[] { "������(O3)", "10", "e15" },
+ new String[] { "������������(NO2)", "10", "e16" },
+ new String[] { "���������������������", "10", "e17" },
+ new String[] { "������", "10", "e18" },
+ new String[] { "������������(CO2)", "10", "e19" }
+ };
OutputStream outputStream = ExportExcelUtils.exportData(response, time + "���" + "���������" + mac + type + "������", sensorsAverage, exportColumn);
outputStream.flush();
outputStream.close();
- result.put("msg", "������������");
}
}
} catch (BusinessException be) {
diff --git a/src/main/java/com/moral/monitor/dao/HistoryEntityMapper.java b/src/main/java/com/moral/monitor/dao/HistoryEntityMapper.java
index ed6a3b1..130719e 100644
--- a/src/main/java/com/moral/monitor/dao/HistoryEntityMapper.java
+++ b/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);
}
\ No newline at end of file
diff --git a/src/main/java/com/moral/monitor/service/ScreenService.java b/src/main/java/com/moral/monitor/service/ScreenService.java
index 2818cff..c6c5bce 100644
--- a/src/main/java/com/moral/monitor/service/ScreenService.java
+++ b/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);
diff --git a/src/main/java/com/moral/monitor/service/impl/ScreenServiceImpl.java b/src/main/java/com/moral/monitor/service/impl/ScreenServiceImpl.java
index eb35a0d..28cfbfb 100644
--- a/src/main/java/com/moral/monitor/service/impl/ScreenServiceImpl.java
+++ b/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,90 +49,93 @@
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();
+ // ������00:00:00
+ parameters.put("start", DateUtils.truncate(DateUtils.addDays(date, -1), Calendar.DATE));
+ // ������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;
+ 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++) {
+ if (avg <= Double.valueOf(macKeyValues[i])) {
+ if (i == 0) {
+ index = i;
+ } else {
+ index = i - 1;
+ }
+ break;
+ }
+ }
+ if (index == -1) {
+ 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]);
+ result = calculateIAQI(maxIAQI, minIAQI, maxMacKey, minMacKey, avg);
+ }
+ }
+ return result;
+ }
+ });
+ }
+
+ // 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
- parameters.put("start", DateUtils.truncate(DateUtils.addMonths(date, -1), Calendar.MONTH));
+ map.put("start", DateUtils.truncate(DateUtils.addMonths(date, -1), Calendar.MONTH));
} else {
// ���������1���00:00:00
- parameters.put("start", DateUtils.truncate(date, Calendar.MONTH));
+ map.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);
-
+ average = historyMapper.getMonthAverageBySensor(map);
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) {
- 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 {
- avg = (Double) average.get("average");
- }
- String[] macKeyValues = ResourceUtil.getArrValue(macKey);
- 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) {
- resultMap.put("AQI", IAQIValues[IAQIValues.length - 1]);
- break;
- } 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));
- }
+ IAQIs.add(cs.take().get());
}
- if (!resultMap.containsKey("AQI")) {
- if (ObjectUtils.isEmpty(IAQIs)) {
- resultMap.put("AQI", "N/A");
- }else {
- double AQI = Collections.max(IAQIs);
- // ������������������
- /*if (AQI == 0.0) {
- AQI = 60.670;
- }*/
+ if (ObjectUtils.isEmpty(IAQIs)) {
+ resultMap.put("AQI", "N/A");
+ } 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;
}
@@ -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"));
diff --git a/src/main/resources/mapper/HistoryEntityMapper.xml b/src/main/resources/mapper/HistoryEntityMapper.xml
index 85374e0..e5b64e7 100644
--- a/src/main/resources/mapper/HistoryEntityMapper.xml
+++ b/src/main/resources/mapper/HistoryEntityMapper.xml
@@ -231,10 +231,10 @@
FROM
history
WHERE
- mac = #{mac}
- AND mac_key = #{macKey}
- AND time > #{start}
- AND time < #{end}
+ mac = #{mac,jdbcType=VARCHAR}
+ AND mac_key = #{macKey,jdbcType=VARCHAR}
+ AND time > #{start,jdbcType=TIMESTAMP}
+ AND time < #{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">
--
Gitblit v1.8.0