From 6688e50ba02988d742baadaca156a303a90b6191 Mon Sep 17 00:00:00 2001 From: fengxiang <110431245@qq.com> Date: Fri, 20 Apr 2018 14:03:37 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/main/java/com/moral/service/HistoryMinutelyService.java | 11 + src/main/resources/mapper/AlarmMapper.xml | 76 ++++++++++ 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 | 81 +++++++++++ src/main/java/com/moral/controller/ReportController.java | 32 +++- src/main/java/com/moral/service/AlarmService.java | 10 + src/main/java/com/moral/controller/ScreenController.java | 30 ++++ src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java | 86 ++++++++--- 9 files changed, 333 insertions(+), 41 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/controller/ScreenController.java b/src/main/java/com/moral/controller/ScreenController.java index 48892d7..7adfbde 100644 --- a/src/main/java/com/moral/controller/ScreenController.java +++ b/src/main/java/com/moral/controller/ScreenController.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -40,6 +41,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.moral.common.bean.Constants; import com.moral.common.bean.JsonData; import com.moral.common.bean.PageResult; import com.moral.common.bean.ResultBean; @@ -53,6 +55,7 @@ import com.moral.entity.alarm.AlarmSensorLevel; import com.moral.service.AccountService; import com.moral.service.AlarmConfigService; +import com.moral.service.AlarmService; import com.moral.service.AreaService; import com.moral.service.DeviceService; import com.moral.service.HistoryMinutelyService; @@ -67,6 +70,7 @@ @RestController @RequestMapping("/screen") //@CrossOrigin(origins = "*", maxAge = 3600) +@SuppressWarnings({ "rawtypes", "unchecked", "unused" }) public class ScreenController { public static Logger log = Logger.getLogger(ScreenController.class); @Resource @@ -108,6 +112,8 @@ /** The level key. */ private String levelKey = "alarm_"; + @Resource + private AlarmService alarmService; /** * Screen login. ������������ * @@ -150,7 +156,6 @@ * the request * @return the alarm levels */ - @SuppressWarnings("resource") @GetMapping("alarm-levels") public Object getAlarmLevels(HttpServletRequest request, Integer orgId) { List<Map<String,Object>> sensorAlarmList = null; @@ -445,4 +450,27 @@ } return new ResultBean<List<Map<String, Object>>>(list); } + + @GetMapping("report_alarm_datas") + public ResultBean<List<Map<String, Object>>> getAlarmData(HttpServletRequest request) throws Exception { + Map<String, Object> parameters = getParametersStartingWith(request, null); + parameters.put("type", "month"); + String sensorKey = "list"; + if (!ObjectUtils.isEmpty(parameters.get("sensorKey"))) { + sensorKey = parameters.remove("sensorKey").toString(); + List<String> sensorKeys = new ArrayList<String>(); + sensorKeys.add(sensorKey); + parameters.put("sensors", sensorKeys); + } + if (!ObjectUtils.isEmpty(parameters.get("organizationId"))) { + if (!Constants.isNotSpecialOrgId(Integer.valueOf(parameters.get("organizationId").toString()))) { + parameters.remove("organizationId"); + } + } + Map pieData = alarmService.getPieData(parameters); + + List<Map<String, Object>> list = (List<Map<String, Object>>) pieData.get(sensorKey); + + return new ResultBean<List<Map<String, Object>>>(list); + } } 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..f04bc52 --- /dev/null +++ b/src/main/java/com/moral/service/impl/AlarmServiceImpl.java @@ -0,0 +1,81 @@ +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) { + Map<String, Object> resultMap = new LinkedHashMap<String, Object>(); + try { + historyMinutelyService.convertQueryParam(parameters); + } catch (ParseException e) { + e.printStackTrace(); + } + List<Map<String, Object>> alarmDatas = alarmMapper.getAlarmData(parameters); + Object dimension = parameters.get("dimension"); + if ("monitorPoint".equals(dimension)) { + 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 = (List) resultMap.get(key); + } + map.put("name", name); + map.put("value", value); + list.add(map); + resultMap.put(key, list); + } + } + } + } else { + Map<String, Object> alarmData = alarmDatas.get(0); + List<String> sensors = (List<String>) parameters.get("sensors"); + List list = new ArrayList(); + for (String key : alarmData.keySet()) { + for (String sensor : sensors) { + String[] split = sensor.split("-"); + if (key.equals(split[0]) && !"0".equals(alarmData.get(key).toString())) { + Map<String, Object> map = new HashMap<String, Object>(); + map.put("name", split[1]); + map.put("value", alarmData.get(key)); + list.add(map); + } + } + } + resultMap.put("list", 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..cad7fec --- /dev/null +++ b/src/main/resources/mapper/AlarmMapper.xml @@ -0,0 +1,76 @@ +<?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> + <choose> + <when test="sensorKeys.size > 0"> + <foreach collection="sensorKeys" separator="," item="sensorKey"> + SUM( ${sensorKey} ) AS '${sensorKey}' + </foreach> + <foreach collection="sensorKeys" open="," separator="+" close=" AS 'sum' " item="sensorKey"> + SUM( ${sensorKey} ) + </foreach> + </when> + <otherwise> + time + </otherwise> + </choose> + FROM + ( + SELECT + <if test="dimension=='monitorPoint'"> + mp.`name`, + </if> + <choose> + <when test="sensorKeys.size > 0"> + <foreach collection="sensorKeys" separator="," item="sensorKey"> + CASE COUNT( json -> '$.${sensorKey}' ) WHEN 0 THEN 0 ELSE 1 END AS '${sensorKey}' + </foreach> + </when> + <otherwise> + DATE_FORMAT( h.time, '%Y-%m-%d' ) AS 'time' + </otherwise> + </choose> + 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="organizationId != null"> + AND mp.organization_id = #{organizationId} + </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