From b52c1e137107abbaee8cdea45964def25c952a7f Mon Sep 17 00:00:00 2001
From: xufenglei <xufenglei>
Date: Wed, 18 Apr 2018 09:01:55 +0800
Subject: [PATCH] 饼图 功能
---
src/main/java/com/moral/service/HistoryMinutelyService.java | 11 +
src/main/resources/mapper/AlarmMapper.xml | 59 +++++++++
src/main/java/com/moral/entity/Alarm.java | 35 +++++
src/main/java/com/moral/mapper/AlarmMapper.java | 13 ++
src/main/java/com/moral/service/impl/AlarmServiceImpl.java | 62 ++++++++++
src/main/java/com/moral/controller/ReportController.java | 32 +++-
src/main/java/com/moral/service/AlarmService.java | 10 +
src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java | 86 ++++++++++----
8 files changed, 268 insertions(+), 40 deletions(-)
diff --git a/src/main/java/com/moral/controller/ReportController.java b/src/main/java/com/moral/controller/ReportController.java
index ed398a7..1d247bb 100644
--- a/src/main/java/com/moral/controller/ReportController.java
+++ b/src/main/java/com/moral/controller/ReportController.java
@@ -4,10 +4,9 @@
import static com.moral.common.util.WebUtils.getParametersStartingWith;
import java.io.OutputStream;
-import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@@ -23,9 +22,10 @@
import com.moral.common.bean.ResultBean;
import com.moral.entity.charts.LineChartCriteria;
+import com.moral.service.AlarmService;
import com.moral.service.HistoryMinutelyService;
-@SuppressWarnings("unchecked")
+@SuppressWarnings({ "unchecked", "rawtypes" })
@RestController
@RequestMapping("report")
@CrossOrigin(origins = "*", maxAge = 3600)
@@ -34,11 +34,14 @@
@Resource
private HistoryMinutelyService historyMinutelyService;
+ @Resource
+ private AlarmService alarmService;
+
@GetMapping("compare")
- public ResultBean<Map<String, List<Object>>> getCompareReport(HttpServletRequest request) throws Exception {
+ public ResultBean<Map<String, List>> getCompareReport(HttpServletRequest request) throws Exception {
Map<String, Object> parameters = getParametersStartingWith(request, null);
- Map<String, List<Object>> demo = historyMinutelyService.getCompareReport(parameters);
- return new ResultBean<Map<String, List<Object>>>(demo);
+ Map<String, List> demo = historyMinutelyService.getCompareReport(parameters);
+ return new ResultBean<Map<String, List>>(demo);
}
@PostMapping("line-chart")
@@ -50,7 +53,7 @@
public ResultBean<Boolean> getExcelReport(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, Object> parameters = getParametersStartingWith(request, null);
List<Map<String, Object>> list = historyMinutelyService.getMonitorPointOrDeviceAvgData(parameters);
- List<String> sensors= (List<String>) parameters.get("sensors");
+ List<String> sensors = (List<String>) parameters.get("sensors");
String[][] exportColumn = new String[sensors.size() + 1][];
exportColumn[0] = new String[] { "������", "20", "time" };
for (int index = 0; index < sensors.size(); index++) {
@@ -58,14 +61,23 @@
String name = split[1];
String key = split[0];
String unit = split[2];
- if (!ObjectUtils.isEmpty(unit) && !"null".equals(unit) ) {
+ if (!ObjectUtils.isEmpty(unit) && !"null".equals(unit)) {
name += "-" + unit;
- }
- exportColumn[index + 1] = new String[] { name , "10", key };
+ }
+ exportColumn[index + 1] = new String[] { name, "10", key };
}
OutputStream outputStream = exportData(response, "Excel������", list, exportColumn);
outputStream.flush();
outputStream.close();
return new ResultBean<Boolean>(true);
}
+
+ @GetMapping("pie")
+ public ResultBean<Map<String, Object>> getPieData(HttpServletRequest request) throws Exception {
+ Map<String, Object> parameters = getParametersStartingWith(request, null);
+ Map pieData = alarmService.getPieData(parameters);
+
+ return new ResultBean<Map<String, Object>>(pieData);
+ }
+
}
diff --git a/src/main/java/com/moral/entity/Alarm.java b/src/main/java/com/moral/entity/Alarm.java
new file mode 100644
index 0000000..55f7f2f
--- /dev/null
+++ b/src/main/java/com/moral/entity/Alarm.java
@@ -0,0 +1,35 @@
+package com.moral.entity;
+
+import java.util.Date;
+
+import lombok.Data;
+
+@Data
+public class Alarm {
+ /**
+ *
+ * This field was generated by MyBatis Generator.
+ * This field corresponds to the database column alarm.mac
+ *
+ * @mbg.generated Mon Apr 16 09:27:36 CST 2018
+ */
+ private String mac;
+
+ /**
+ *
+ * This field was generated by MyBatis Generator.
+ * This field corresponds to the database column alarm.json
+ *
+ * @mbg.generated Mon Apr 16 09:27:36 CST 2018
+ */
+ private String json;
+
+ /**
+ *
+ * This field was generated by MyBatis Generator.
+ * This field corresponds to the database column alarm.time
+ *
+ * @mbg.generated Mon Apr 16 09:27:36 CST 2018
+ */
+ private Date time;
+}
\ No newline at end of file
diff --git a/src/main/java/com/moral/mapper/AlarmMapper.java b/src/main/java/com/moral/mapper/AlarmMapper.java
new file mode 100644
index 0000000..a184316
--- /dev/null
+++ b/src/main/java/com/moral/mapper/AlarmMapper.java
@@ -0,0 +1,13 @@
+package com.moral.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.moral.common.mapper.BaseMapper;
+import com.moral.entity.Alarm;
+
+public interface AlarmMapper extends BaseMapper<Alarm> {
+
+ List<Map<String, Object>> getAlarmData(Map<String, Object> parameters);
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/moral/service/AlarmService.java b/src/main/java/com/moral/service/AlarmService.java
new file mode 100644
index 0000000..e3a8a45
--- /dev/null
+++ b/src/main/java/com/moral/service/AlarmService.java
@@ -0,0 +1,10 @@
+package com.moral.service;
+
+import java.util.Map;
+
+@SuppressWarnings("rawtypes")
+public interface AlarmService {
+
+ Map getPieData(Map<String, Object> parameters);
+
+}
diff --git a/src/main/java/com/moral/service/HistoryMinutelyService.java b/src/main/java/com/moral/service/HistoryMinutelyService.java
index f1dacc2..0c106f6 100644
--- a/src/main/java/com/moral/service/HistoryMinutelyService.java
+++ b/src/main/java/com/moral/service/HistoryMinutelyService.java
@@ -1,16 +1,17 @@
package com.moral.service;
-import com.moral.entity.charts.LineChartCriteria;
-import com.moral.entity.charts.PairData;
-
+import java.text.ParseException;
import java.util.List;
import java.util.Map;
+import com.moral.entity.charts.LineChartCriteria;
+
+@SuppressWarnings("rawtypes")
public interface HistoryMinutelyService {
Map<String, Object> getDayAQIByDevice(Map<String, Object> parameters);
- Map<String, List<Object>> getCompareReport(Map<String, Object> parameters) throws Exception;
+ Map<String, List> getCompareReport(Map<String, Object> parameters) throws Exception;
List<Map<String, Object>> getMonitorPointOrDeviceAvgData(Map<String, Object> parameters) throws Exception;
@@ -18,4 +19,6 @@
Map<String, List<List<Double>>> queryLineChartDateByCrieria(LineChartCriteria lineChartCriteria);
+
+ void convertQueryParam(Map<String, Object> parameters) throws ParseException;
}
diff --git a/src/main/java/com/moral/service/impl/AlarmServiceImpl.java b/src/main/java/com/moral/service/impl/AlarmServiceImpl.java
new file mode 100644
index 0000000..8b2e03c
--- /dev/null
+++ b/src/main/java/com/moral/service/impl/AlarmServiceImpl.java
@@ -0,0 +1,62 @@
+package com.moral.service.impl;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import com.moral.mapper.AlarmMapper;
+import com.moral.service.AlarmService;
+import com.moral.service.HistoryMinutelyService;
+
+@Service
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public class AlarmServiceImpl implements AlarmService {
+
+ @Resource
+ private AlarmMapper alarmMapper;
+
+ @Resource
+ private HistoryMinutelyService historyMinutelyService;
+
+ @Override
+ public Map getPieData(Map<String, Object> parameters) {
+ try {
+ historyMinutelyService.convertQueryParam(parameters);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ List<Map<String, Object>> alarmDatas = alarmMapper.getAlarmData(parameters);
+ Map<String, List> resultMap = new LinkedHashMap<String, List>();
+ for (Map<String, Object> alarmData : alarmDatas) {
+ String name = alarmData.remove("name").toString();
+ alarmData.remove("sum");
+ for (Map.Entry<String, Object> entry : alarmData.entrySet()) {
+ String key = entry.getKey();
+ Object value = entry.getValue().toString();
+ if (!"0".equals(value)) {
+ List list;
+ Map<String, Object> map = new HashMap<String, Object>();
+ if (ObjectUtils.isEmpty(resultMap.get(key))) {
+ list = new ArrayList();
+ } else {
+ list = resultMap.get(key);
+ }
+ map.put("name", name);
+ map.put("value", value);
+ list.add(map);
+ resultMap.put(key, list);
+ }
+ }
+ }
+ return resultMap;
+ }
+
+}
diff --git a/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java b/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java
index e71ff2a..d1653fc 100644
--- a/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java
+++ b/src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java
@@ -4,7 +4,7 @@
import static org.springframework.util.ObjectUtils.isEmpty;
import java.math.BigDecimal;
-import java.math.RoundingMode;
+import java.text.ParseException;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
@@ -15,7 +15,6 @@
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;
@@ -31,11 +30,6 @@
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;
@@ -43,17 +37,21 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.moral.common.util.CalculateUtils;
+import com.moral.common.util.ReportTimeFormat;
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.entity.charts.DataCondition;
+import com.moral.entity.charts.LineChartCriteria;
+import com.moral.entity.charts.TimePeriod;
+import com.moral.mapper.AlarmMapper;
import com.moral.mapper.DeviceMapper;
import com.moral.mapper.HistoryMinutelyMapper;
import com.moral.mapper.SensorMapper;
import com.moral.service.HistoryMinutelyService;
@Service
-@SuppressWarnings({ "unchecked", "unused" })
+@SuppressWarnings({ "unchecked", "unused", "rawtypes" })
public class HistoryMinutelyServiceImpl implements HistoryMinutelyService {
@Resource
@@ -65,7 +63,8 @@
@Resource
private SensorMapper sensorMapper;
- // volatile
+ @Resource
+ private AlarmMapper alarmMapper;
@Override
public Map<String, Object> getDayAQIByDevice(Map<String, Object> parameters) {
@@ -76,8 +75,7 @@
// ������00:00:00
parameters.put("end", localDate);
- String[] macKeys = { "e1", "e2", "e10", "e11", "e15", "e16" };
- parameters.put("sensorKeys", Arrays.asList(macKeys));
+ parameters.put("sensorKeys", Arrays.asList("e1", "e2", "e10", "e11", "e15", "e16"));
Map<String, Double> average = historyMinutelyMapper.getSersionAvgByDevice(parameters);
return getAQIByDataMap(average);
}
@@ -135,8 +133,8 @@
}
@Override
- public Map<String, List<Object>> getCompareReport(Map<String, Object> parameters) throws Exception {
- Map<String, List<Object>> resultMap = new HashMap<String, List<Object>>();
+ 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");
@@ -183,32 +181,58 @@
}
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 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()) {
- if (key.startsWith("data")) {
- int index = Integer.valueOf(key.replace("data", ""));
- datas[index] = map.get(key);
- }
- if (key.startsWith("deviceCount")) {
- int index = Integer.valueOf(key.replace("deviceCount", ""));
- deviceCounts[index] = map.get(key);
- }
- if (key.startsWith("sensors")) {
- sensors.addAll((List<String>) map.get(key));
+ 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()) {
+ 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) {
+ return o1.getValue().compareTo(o2.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;
}
@@ -250,11 +274,23 @@
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"));
+ resultMap.put("alarmData" + part, alarmMapper.getAlarmData(parameters).get(0));
+ }
return resultMap;
}
@Override
public List<Map<String, Object>> getMonitorPointOrDeviceAvgData(Map<String, Object> parameters) throws Exception {
+ convertQueryParam(parameters);
+
+ return historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameters);
+ }
+
+ @Override
+ public void convertQueryParam(Map<String, Object> parameters) throws ParseException {
String type = (String) parameters.get("type");
if (!parameters.containsKey("field")) {
parameters.putAll(getElementByType(type));
@@ -294,8 +330,6 @@
}
parameters.put("sensorKeys", sensorKeys);
parameters.put("sensors", sensors);
-
- return historyMinutelyMapper.getMonitorPointOrDeviceAvgData(parameters);
}
@Override
diff --git a/src/main/resources/mapper/AlarmMapper.xml b/src/main/resources/mapper/AlarmMapper.xml
new file mode 100644
index 0000000..e9abda1
--- /dev/null
+++ b/src/main/resources/mapper/AlarmMapper.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.moral.mapper.AlarmMapper">
+ <select id="getAlarmData" resultType="java.util.LinkedHashMap">
+ SELECT
+ <if test="dimension=='monitorPoint'">
+ `name`,
+ </if>
+ <foreach collection="sensorKeys" item="sensorKey" separator=",">
+ SUM( ${sensorKey} ) AS '${sensorKey}'
+ </foreach>
+ <foreach close=" AS 'sum' " collection="sensorKeys" item="sensorKey" open="," separator="+">
+ SUM( ${sensorKey} )
+ </foreach>
+ FROM
+ (
+ SELECT
+ <if test="dimension=='monitorPoint'">
+ mp.`name`,
+ </if>
+ <foreach collection="sensorKeys" item="sensorKey" separator=",">
+ CASE COUNT( json -> '$.${sensorKey}' ) WHEN 0 THEN 0 ELSE 1 END AS '${sensorKey}'
+ </foreach>
+ FROM
+ alarm h,
+ device d,
+ monitor_point mp
+ WHERE d.monitor_point_id = mp.id
+ AND h.mac = d.mac
+ AND h.time >= #{start}
+ AND h.time <![CDATA[<]]> #{end}
+ <if test="provinceCode != null">
+ AND mp.province_code = #{provinceCode}
+ </if>
+ <if test="cityCode != null">
+ AND mp.city_code = #{cityCode}
+ </if>
+ <if test="areaCode != null">
+ AND mp.area_code = #{areaCode}
+ </if>
+ <if test="monitorPointId != null">
+ AND mp.id = #{monitorPointId}
+ </if>
+ <if test="mac != null">
+ AND d.mac = #{mac}
+ </if>
+ GROUP BY
+ <if test="dimension=='monitorPoint'">
+ mp.id,
+ </if>
+ DATE_FORMAT( h.time, '%Y-%m-%d' )
+ ) a
+ <if test="dimension=='monitorPoint'">
+ GROUP BY name
+ </if>
+
+ </select>
+
+</mapper>
\ No newline at end of file
--
Gitblit v1.8.0