From e5102b46b77fa8381caa914b4cec89baa5f5e0df Mon Sep 17 00:00:00 2001
From: lizijie <lzjiiie@163.com>
Date: Thu, 08 Aug 2019 17:17:35 +0800
Subject: [PATCH] AQI计算工具类

---
 src/main/java/com/moral/service/impl/HistoryServiceImpl.java |   17 ++++
 src/main/java/com/moral/util/AQICalculation.java             |  178 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 194 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/moral/service/impl/HistoryServiceImpl.java b/src/main/java/com/moral/service/impl/HistoryServiceImpl.java
index da7fdbd..461bfea 100644
--- a/src/main/java/com/moral/service/impl/HistoryServiceImpl.java
+++ b/src/main/java/com/moral/service/impl/HistoryServiceImpl.java
@@ -38,6 +38,7 @@
 import com.moral.service.AccountService;
 import com.moral.service.HistoryService;
 import com.moral.service.ProfessionService;
+import com.moral.util.AQICalculation;
 
 @Service
 public class HistoryServiceImpl implements HistoryService {
@@ -359,6 +360,20 @@
 			startTime = localDate+" "+startHour+":00:00";
 		}
 		Map<String, Object> map = historyMapper.getAVGValueByMacAndTimeslot(mac, startTime, endTime);
-		return map;
+		System.out.println(map);
+		Map<String, Object> returnMap = new HashMap<>();
+		if (map.isEmpty()) {
+			returnMap.put("AQI", "N/V");
+		} else {
+			Map<String, Double> AQIMap = new HashMap<>();
+			for (Map.Entry<String, Object> entry : map.entrySet()) {
+				String key = entry.getKey();
+				Double value = Double.parseDouble(entry.getValue().toString());
+				AQIMap.put(key, value);
+	        }
+			returnMap = AQICalculation.hourlyAQI(AQIMap);
+		}
+		
+		return returnMap;
 	}
 }
diff --git a/src/main/java/com/moral/util/AQICalculation.java b/src/main/java/com/moral/util/AQICalculation.java
new file mode 100644
index 0000000..da7444f
--- /dev/null
+++ b/src/main/java/com/moral/util/AQICalculation.java
@@ -0,0 +1,178 @@
+package com.moral.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AQICalculation {
+	
+	public static Map<String, Object> hourlyAQI(Map<String, Double> map){
+		List<Double> AQIList = new ArrayList<>();
+		for (Map.Entry<String, Double> entry : map.entrySet()) {
+			String key = entry.getKey();
+			Double value = entry.getValue();
+			Double PM2_5AQI;
+			Double PM10AQI;
+			Double SO2AQI;
+			Double NO2AQI;
+			Double COAQI;
+			Double O3AQI;
+			switch (key) {
+			case "e1":PM2_5AQI = PM2_5AQI(value);
+				AQIList.add(PM2_5AQI);
+				break;
+			case "e2":PM10AQI = PM10AQI(value);
+				AQIList.add(PM10AQI);
+				break;
+			case "e11":SO2AQI = SO2AQI(value);
+				AQIList.add(SO2AQI);
+				break;
+			case "e16":NO2AQI = NO2AQI(value);
+				AQIList.add(NO2AQI);
+				break;
+			case "e10":COAQI = COAQI(value);
+				AQIList.add(COAQI);
+				break;
+			case "e15":O3AQI = O3AQI(value);
+				AQIList.add(O3AQI);
+				break;
+
+			default:
+				break;
+			}
+        }
+		Double AQIMAX = Collections.max(AQIList);
+		Map<String, Object> returnMap = new HashMap<>();
+		returnMap.put("AQI", AQIMAX);
+		return returnMap;
+	}
+	
+	static double PM2_5AQI(Double value) {
+		Double result = (double) 0;
+		if(value<=0) {
+			result=(double) 0;
+		}else if (value<=35) {
+			result = 50/35*(value-0)+0;
+		}else if (value<=75) {
+			result = 50/40*(value-35)+50;
+		}else if (value<=115) {
+			result = 50/40*(value-75)+100;
+		}else if (value<=150) {
+			result = 50/35*(value-115)+150;
+		}else if (value<=250) {
+			result = 100/100*(value-150)+200;
+		}else if (value<=350) {
+			result = 100/100*(value-250)+300;
+		}else if (value<=500) {
+			result = 100/150*(value-350)+400;
+		}
+		return result;
+	}
+	
+	static double PM10AQI(Double value) {
+		Double result = (double) 0;
+		if(value<=0) {
+			result=(double) 0;
+		}else if (value<=50) {
+			result = 50/50*(value-0)+0;
+		}else if (value<=150) {
+			result = 50/100*(value-50)+50;
+		}else if (value<=250) {
+			result = 50/100*(value-150)+100;
+		}else if (value<=350) {
+			result = 50/100*(value-250)+150;
+		}else if (value<=420) {
+			result = 100/70*(value-350)+200;
+		}else if (value<=500) {
+			result = 100/80*(value-420)+300;
+		}else if (value<=600) {
+			result = 100/100*(value-500)+400;
+		}
+		return result;
+	}
+
+	static double SO2AQI(Double value) {
+		Double result = (double) 0;
+		if(value<=0) {
+			result=(double) 0;
+		}else if (value<=150) {
+			result = 50/150*(value-0)+0;
+		}else if (value<=500) {
+			result = 50/350*(value-150)+50;
+		}else if (value<=650) {
+			result = 50/150*(value-500)+100;
+		}else if (value<=800) {
+			result = 50/150*(value-650)+150;
+		}
+		return result;
+	}
+
+	static double NO2AQI(Double value) {
+		Double result = (double) 0;
+		if(value<=0) {
+			result=(double) 0;
+		}else if (value<=100) {
+			result = 50/100*(value-0)+0;
+		}else if (value<=200) {
+			result = 50/100*(value-100)+50;
+		}else if (value<=700) {
+			result = 50/500*(value-200)+100;
+		}else if (value<=1200) {
+			result = 50/500*(value-700)+150;
+		}else if (value<=2340) {
+			result = 100/1140*(value-1200)+200;
+		}else if (value<=3090) {
+			result = 100/750*(value-2340)+300;
+		}else if (value<=3840) {
+			result = 100/750*(value-3090)+400;
+		}
+		return result;
+	}
+
+	static double COAQI(Double value) {
+		Double result = (double) 0;
+		if(value<=0) {
+			result=(double) 0;
+		}else if (value<=5) {
+			result = 50/5*(value-0)+0;
+		}else if (value<=10) {
+			result = 50/5*(value-5)+50;
+		}else if (value<=35) {
+			result = 50/25*(value-10)+100;
+		}else if (value<=60) {
+			result = 50/25*(value-35)+150;
+		}else if (value<=90) {
+			result = 100/30*(value-60)+200;
+		}else if (value<=120) {
+			result = 100/30*(value-90)+300;
+		}else if (value<=150) {
+			result = 100/30*(value-120)+400;
+		}
+		return result;
+	}
+
+	static double O3AQI(Double value) {
+		Double result = (double) 0;
+		if(value<=0) {
+			result=(double) 0;
+		}else if (value<=100) {
+			result = 50/100*(value-0)+0;
+		}else if (value<=160) {
+			result = 50/60*(value-100)+50;
+		}else if (value<=215) {
+			result = 50/55*(value-160)+100;
+		}else if (value<=265) {
+			result = 50/150*(value-215)+150;
+		}else if (value<=800) {
+			result = 100/535*(value-265)+200;
+		}else if (value<=2100) {
+			result = 100/12*(value-800)+300;
+		}else if (value<=2620) {
+			result = 100/12*(value-48)+400;
+		}
+		return result;
+	}
+	
+}

--
Gitblit v1.8.0