xufenglei
2018-04-18 b52c1e137107abbaee8cdea45964def25c952a7f
饼图 功能
5 files added
3 files modified
308 ■■■■ changed files
src/main/java/com/moral/controller/ReportController.java 32 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/entity/Alarm.java 35 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/mapper/AlarmMapper.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/service/AlarmService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/service/HistoryMinutelyService.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/service/impl/AlarmServiceImpl.java 62 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/service/impl/HistoryMinutelyServiceImpl.java 86 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/AlarmMapper.xml 59 ●●●●● patch | view | raw | blame | history
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);
    }
}
src/main/java/com/moral/entity/Alarm.java
New file
@@ -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;
}
src/main/java/com/moral/mapper/AlarmMapper.java
New file
@@ -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);
}
src/main/java/com/moral/service/AlarmService.java
New file
@@ -0,0 +1,10 @@
package com.moral.service;
import java.util.Map;
@SuppressWarnings("rawtypes")
public interface AlarmService {
    Map getPieData(Map<String, Object> parameters);
}
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;
}
src/main/java/com/moral/service/impl/AlarmServiceImpl.java
New file
@@ -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;
    }
}
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
src/main/resources/mapper/AlarmMapper.xml
New file
@@ -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>