工业级运维app手机api
xufenglei
2017-11-16 c95b4b1890598b1e451fa593c173d37952cff58d
接口拆分
4 files modified
183 ■■■■■ changed files
src/main/java/com/moral/monitor/controller/ScreenController.java 67 ●●●●● patch | view | raw | blame | history
src/main/java/com/moral/monitor/service/ScreenService.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/moral/monitor/service/impl/ScreenServiceImpl.java 106 ●●●●● patch | view | raw | blame | history
src/main/resources/mongodb/mongodb-config.properties 6 ●●●● patch | view | raw | blame | history
src/main/java/com/moral/monitor/controller/ScreenController.java
@@ -9,25 +9,27 @@
import javax.servlet.http.HttpServletRequest;
import com.alibaba.fastjson.JSON;
import com.moral.monitor.util.RedisUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONReader;
import com.alibaba.fastjson.TypeReference;
import com.moral.monitor.entity.AccountEntity;
import com.moral.monitor.service.ScreenService;
import com.moral.monitor.util.BusinessException;
import com.moral.monitor.util.Crypto;
import com.moral.monitor.util.RedisUtil;
import com.moral.monitor.util.ResourceUtil;
import com.moral.monitor.util.WebUtils;
@RestController
@@ -201,4 +203,65 @@
        }
        return result;
    }
    @RequestMapping(value = "month-sensor-average", method = RequestMethod.GET)
    public Map<String, Object> getMonthAverageBySensor(HttpServletRequest request) {
        Map<String, Object> result = new HashMap<String, Object>();
        try {
            Map<String, Object> parameters = WebUtils.getParametersStartingWith(request, null);
            if (!(parameters.containsKey("mac") && parameters.containsKey("macKey"))) {
                result.put("msg", "参数不能为空!");
            } else {
                result = screenService.getMonthAverageBySensor(parameters);
            }
        } catch (BusinessException be) {
            be.printStackTrace();
            result.put("msg", be.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            result.put("msg", "系统错误,请联系管理员!原因如下:"+e.getMessage());
        }
        return result;
    }
    @RequestMapping(value = "day-aqi", method = RequestMethod.GET)
    public Map<String, Object> getDayAQIBySensor(HttpServletRequest request) {
        Map<String, Object> result = new HashMap<String, Object>();
        try {
            Map<String, Object> parameters = WebUtils.getParametersStartingWith(request, null);
            if (!parameters.containsKey("mac")) {
                result.put("msg", "参数不能为空!");
            } else {
                result = screenService.getDayAQIBySensor(parameters);
            }
        } catch (BusinessException be) {
            be.printStackTrace();
            result.put("msg", be.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            result.put("msg", "系统错误,请联系管理员!原因如下:"+e.getMessage());
        }
        return result;
    }
    @RequestMapping(value = "sensor-standard", method = RequestMethod.GET)
    public Map<String, Object> getStandardBySensor(HttpServletRequest request) {
        Map<String, Object> result = new HashMap<String, Object>();
        try {
            String macKey = request.getParameter("macKey");
            if (ObjectUtils.isEmpty(macKey)) {
                result.put("msg", "参数不能为空!");
            } else {
                result.put("standard", ResourceUtil.getValue(macKey + "-standard"));
            }
        } catch (BusinessException be) {
            be.printStackTrace();
            result.put("msg", be.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            result.put("msg", "系统错误,请联系管理员!原因如下:"+e.getMessage());
        }
        return result;
    }
}
src/main/java/com/moral/monitor/service/ScreenService.java
@@ -17,4 +17,8 @@
    Map<String, Object> getAverageBySensor(Map<String, Object> parameters);
    Map<String, Object> getMonthAverageBySensor(Map<String, Object> parameters);
    Map<String, Object> getDayAQIBySensor(Map<String, Object> parameters) throws Exception;
}
src/main/java/com/moral/monitor/service/impl/ScreenServiceImpl.java
@@ -5,6 +5,7 @@
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -18,9 +19,14 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import com.mongodb.BasicDBObject;
import com.moral.monitor.dao.AccountEntityMapper;
import com.moral.monitor.dao.HistoryEntityMapper;
import com.moral.monitor.entity.AccountEntity;
@@ -43,6 +49,9 @@
    @Autowired
    private OrganizationService organizationService;
    @Autowired
    private MongoTemplate mongoTemplate;
    public List<AccountEntity> getAccountLists(String account, String password) {
        AccountEntityExample example = new AccountEntityExample();
        example.or().andAccountEqualTo(account).andPasswordEqualTo(password);
@@ -120,11 +129,11 @@
            resultMap.put("average", String.format("%.2f", average.get("average")));
        }
        
        List<Double> IAQIs = new ArrayList<Double>();
        Set<Double> IAQIs = new HashSet<Double>();
        for (String macKey : macKeys) {
            IAQIs.add(cs.take().get());
        }
        IAQIs.remove(null);
        if (ObjectUtils.isEmpty(IAQIs)) {
            resultMap.put("AQI", "N/A");
        } else {
@@ -224,4 +233,97 @@
        return result;
    }
    @Override
    public Map<String, Object> getMonthAverageBySensor(Map<String, Object> parameters) {
        Map<String, Object> result = new HashMap<String, Object>();
        Date date = new Date();
        Long end = DateUtils.truncate(date, Calendar.DATE).getTime(),start;
        // 每月一日的数据取上月的数据
        if (1 == Calendar.getInstance().get(Calendar.DAY_OF_MONTH)) {
            // 上个月1日00:00:00
            start = DateUtils.truncate(DateUtils.addMonths(date, -1), Calendar.MONTH).getTime();
        } else {
            // 这个月1日00:00:00
            start =  DateUtils.truncate(date, Calendar.MONTH).getTime();
        }
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("mac").is(parameters.get("mac"))),
                Aggregation.match(Criteria.where("time").gte(start)),
                Aggregation.match(Criteria.where("time").lt(end)),
                Aggregation.group("mac").avg((String) parameters.get("macKey")).as("avg")
            );
        AggregationResults<BasicDBObject> results = mongoTemplate.aggregate(aggregation, "data",BasicDBObject.class);
        List<BasicDBObject> list = results.getMappedResults();
        if (!ObjectUtils.isEmpty(list)) {
            result = list.get(0);
        }
        return result;
    }
    @Override
    public Map<String, Object> getDayAQIBySensor(final Map<String, Object> parameters) throws Exception {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        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;
                }
            });
        }
        Set<Double> IAQIs = new HashSet<Double>();
        for (String macKey : macKeys) {
            IAQIs.add(cs.take().get());
        }
        IAQIs.remove(null);
        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;
    }
}
src/main/resources/mongodb/mongodb-config.properties
@@ -7,10 +7,10 @@
#当前所有的connection都在使用中,则每个connection上可以有N个线程排队等待
mongo.threadsAllowedToBlockForConnectionMultiplier=4
#在建立(打开)套接字连接时的超时时间(ms),默以为0
mongo.connectTimeout=1000
mongo.connectTimeout=10000
#被阻塞线程从连接池获取连接的最长等待时间(ms)
mongo.maxWaitTime=1500
mongo.maxWaitTime=15000
#是否维持socket的保活状态
mongo.socketKeepAlive=true
#套接字超时时间;该值会被传递给Socket.setSoTimeout(int)。默以为0(无穷)
mongo.socketTimeout=1500
mongo.socketTimeout=15000