com.yougou.api.service.impl.ApiAnalyzeServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.yougou.api.service.impl.ApiAnalyzeServiceImpl.java

Source

package com.yougou.api.service.impl;

import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import com.belle.infrastructure.util.JDBCUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.yougou.api.model.vo.ApiAllCount;
import com.yougou.api.model.vo.ApiAnalyzeDetailVo;
import com.yougou.api.model.vo.ApiCount;
import com.yougou.api.model.vo.ApiMetadata;
import com.yougou.api.model.vo.AppKeyCount;
import com.yougou.api.model.vo.AppKeyMetadata;
import com.yougou.api.mongodb.GenericMongoDao;
import com.yougou.api.service.IApiAnalyzeService;
import com.yougou.api.util.RedisKeyUtils;
import com.yougou.dms.api.ApiDistributorService;
import com.yougou.merchant.api.common.Constant;
import com.yougou.merchant.api.monitor.service.IApiMonitorService;
import com.yougou.merchant.api.monitor.vo.ApiMonitorParameterVo;
import com.yougou.merchant.api.monitor.vo.MonitorAppKeyDetailVo;
import com.yougou.merchant.api.monitor.vo.MonitorAppKeyTemplate;
import com.yougou.merchant.api.monitor.vo.MonitorAppKeyVo;
import com.yougou.merchant.api.monitor.vo.MonitorConfig;
import com.yougou.merchant.api.monitor.vo.MonitorRateWarnDetail;
import com.yougou.merchant.api.monitor.vo.MonitorTemplateDetail;
import com.yougou.merchant.api.supplier.service.ISupplierService;
import com.yougou.merchant.api.supplier.vo.SupplierVo;

@Service
public class ApiAnalyzeServiceImpl implements IApiAnalyzeService {

    @Resource(name = "stringRedisTemplate")
    private ValueOperations<String, String> valueOperations;

    @Resource(name = "stringRedisTemplate")
    private HashOperations<String, String, String> hashOperations;

    @Resource(name = "stringRedisTemplate")
    private SetOperations<String, String> setOperations;

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Resource
    private ISupplierService supplierService;

    @Resource
    private ApiDistributorService apiDistributorService;

    @Resource
    private GenericMongoDao genericMongoDao;

    @Resource
    private JdbcTemplate jdbcTemplate;

    private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

    private Logger logger = Logger.getLogger(ApiAnalyzeServiceImpl.class);

    public static final String API_CONFIG_REDIS_KEY = "api_config_redis_key";
    public static final String APPKEY_CONFIG_REDIS_KEY = "appkey_config_redis_key";

    private static final String SQL_FINDCOUNTGROUPBYAPPKEY = "SELECT t.app_key appkey,SUM(t.call_count) callCount FROM tbl_merchant_api_analyze_detail t WHERE t.time_quantum >= ? AND t.time_quantum <= ? group by t.app_key";

    @Resource
    private IApiMonitorService apiMonitorService;

    public List<AppKeyCount> findAppKeyCountByApiId(String apiId) throws Exception {
        List<AppKeyCount> list = new ArrayList<AppKeyCount>();
        List<Map<String, Object>> mapList = this.getAppKeyCountByApiId(apiId);
        Set<String> set = setOperations.members(RedisKeyUtils.COUNT_SET_KEY);

        for (Map<String, Object> map : mapList) {
            String appkey = MapUtils.getString(map, "app_key");
            String api = MapUtils.getString(map, "api_method");
            Long count = 0L;
            Long exTime = 0L;
            Long failCount = 0L;
            for (String str : set) {
                String apiStr = str.split(":")[0];
                String appkeyStr = str.split(":")[1];
                if (StringUtils.equals(apiStr, api) && StringUtils.equals(appkeyStr, appkey)) {
                    String apikeyCountKey = RedisKeyUtils.getApiKeyALlKey(apiStr, appkeyStr,
                            RedisKeyUtils.CALL_COUNT);
                    String apikeyFailCountKey = RedisKeyUtils.getApiKeyALlKey(apiStr, appkeyStr,
                            RedisKeyUtils.FAIL_CALL_COUNT);
                    String apikeyExTimeKey = RedisKeyUtils.getApiKeyALlKey(apiStr, appkeyStr,
                            RedisKeyUtils.EX_TIME);
                    count = count + Long.valueOf(valueOperations.get(apikeyCountKey) == null ? "0"
                            : valueOperations.get(apikeyCountKey));
                    exTime = exTime + Long.valueOf(valueOperations.get(apikeyExTimeKey) == null ? "0"
                            : valueOperations.get(apikeyExTimeKey));
                    failCount = failCount + Long.valueOf(valueOperations.get(apikeyFailCountKey) == null ? "0"
                            : valueOperations.get(apikeyFailCountKey));
                }
            }
            if (count != 0) {
                AppKeyCount appkeyCount = new AppKeyCount();
                appkeyCount.setAppkey(appkey);
                appkeyCount.setAppkeyUser(this.getKeyUserByAppkey(appkey));
                appkeyCount.setCallCount(count);
                appkeyCount.setExTime(exTime);
                appkeyCount.setFailCount(failCount);
                list.add(appkeyCount);
            }
        }
        return list;
    }

    public List<ApiCount> findApiCountByAppKeyOwner(String appKeyOwner) {
        List<ApiCount> list = new ArrayList<ApiCount>();
        List<Map<String, Object>> mapList = this.getApiCountByApiId(appKeyOwner);
        Set<String> set = setOperations.members(RedisKeyUtils.COUNT_SET_KEY);
        for (Map<String, Object> map : mapList) {
            String api = MapUtils.getString(map, "api_method");
            Long count = 0L;
            Long exTime = 0L;
            Long failCount = 0L;
            for (String str : set) {
                String apiStr = str.split(":")[0];
                String appkeyStr = str.split(":")[1];
                if (StringUtils.equals(apiStr, api) && StringUtils.equals(appkeyStr, appKeyOwner)) {
                    String apikeyCountKey = RedisKeyUtils.getApiKeyALlKey(apiStr, appkeyStr,
                            RedisKeyUtils.CALL_COUNT);
                    String apikeyFailCountKey = RedisKeyUtils.getApiKeyALlKey(apiStr, appkeyStr,
                            RedisKeyUtils.FAIL_CALL_COUNT);
                    String apikeyExTimeKey = RedisKeyUtils.getApiKeyALlKey(apiStr, appkeyStr,
                            RedisKeyUtils.EX_TIME);
                    count = count + Long.valueOf(valueOperations.get(apikeyCountKey) == null ? "0"
                            : valueOperations.get(apikeyCountKey));
                    exTime = exTime + Long.valueOf(valueOperations.get(apikeyExTimeKey) == null ? "0"
                            : valueOperations.get(apikeyExTimeKey));
                    failCount = failCount + Long.valueOf(valueOperations.get(apikeyFailCountKey) == null ? "0"
                            : valueOperations.get(apikeyFailCountKey));
                }
            }

            if (count != 0) {
                ApiCount apiCount = new ApiCount();
                String apiName = MapUtils.getString(map, "api_name");
                String apiMethod = MapUtils.getString(map, "api_method");
                apiCount.setApiName(apiName + apiMethod);
                apiCount.setCallCount(count);
                apiCount.setFailCount(Long.valueOf(failCount));
                apiCount.setExTime(failCount);
                list.add(apiCount);
            }
        }
        return list;
    }

    public ApiAllCount findApiAllCount() {
        ApiAllCount apiAllCount = new ApiAllCount();
        String callAllKey = RedisKeyUtils.getCountALlKey(RedisKeyUtils.CALL_COUNT);
        Long callCount = Long.valueOf(valueOperations.get(callAllKey));
        apiAllCount.setCallCount(callCount);
        String failCallKey = RedisKeyUtils.getCountALlKey(RedisKeyUtils.FAIL_CALL_COUNT);
        Long failCount = Long
                .valueOf(valueOperations.get(failCallKey) == null ? "0" : valueOperations.get(failCallKey));
        apiAllCount.setFailCount(failCount);
        String exTimeKey = RedisKeyUtils.getCountALlKey(RedisKeyUtils.EX_TIME);
        Long exTime = Long.valueOf(valueOperations.get(exTimeKey));
        apiAllCount.setExTime(Long.valueOf(exTime));
        return apiAllCount;
    }

    public String findApiIdByName(String apiMethod) {
        String sql = "SELECT t.id FROM tbl_merchant_api t WHERE t.api_method = ? ";
        String id = (String) JDBCUtils.getInstance().uniqueResult(sql, new Object[] { apiMethod });
        return id;
    }

    public List<Map<String, Object>> getAppKeyCountByApiId(String apiId) {
        if (StringUtils.isBlank(apiId)) {
            return Collections.emptyList();
        }

        StringBuffer sb = new StringBuffer();
        sb.append(
                " SELECT t3.app_key,t4.metadata_val,t4.metadata_key,t2.api_method  FROM tbl_merchant_api_license t1 ");
        sb.append(" INNER JOIN tbl_merchant_api t2 on t2.id = t1.api_id ");
        sb.append(" INNER JOIN tbl_merchant_api_key t3 on t3.id = t1.key_id ");
        sb.append(" INNER JOIN tbl_merchant_api_key_metadata t4 on t4.key_id = t3.id ");
        sb.append(" WHERE t2.id = ? ");

        Object[] values = { apiId };
        return JDBCUtils.getInstance().listResultMap(sb.toString(), values);
    }

    public List<Map<String, Object>> getApiCountByApiId(String appkey) {
        if (StringUtils.isBlank(appkey)) {
            return Collections.emptyList();
        }

        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT t2.api_name,t2.api_method FROM tbl_merchant_api_license t1  ");
        sb.append(" INNER JOIN tbl_merchant_api t2 on t2.id = t1.api_id ");
        sb.append(" INNER JOIN tbl_merchant_api_key t3 on t3.id = t1.key_id ");
        sb.append(" INNER JOIN tbl_merchant_api_key_metadata t4 on t4.key_id = t3.id ");
        sb.append(" WHERE t3.app_key = ? ");

        Object[] values = { appkey };
        return JDBCUtils.getInstance().listResultMap(sb.toString(), values);
    }

    public Map<String, Object> getApiCountSum(String apiId, String timeQuantum) {
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT SUM(t.call_count) AS call_count,SUM(t.fail_call_count) as fail_call_count, ");
        sb.append(" SUM(t.sucess_call_count) AS sucess_call_count,SUM(t.avg_ex_time) as avg_ex_time ");
        sb.append(" FROM tbl_merchant_api_analyze_detail t  ");
        sb.append(" WHERE t.api_id = ? ");
        sb.append(" AND t.time_quantum  like ? ");
        Object[] values = { apiId, timeQuantum + "%" };
        List<Map<String, Object>> list = JDBCUtils.getInstance().listResultMap(sb.toString(), values);
        if (CollectionUtils.isNotEmpty(list)) {
            return list.get(0);
        }
        return null;
    }

    public Map<String, Object> getAppKeyCountSum(String appKey, String timeQuantum) {
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT SUM(t.call_count) AS call_count,SUM(t.fail_call_count) as fail_call_count, ");
        sb.append(" SUM(t.sucess_call_count) AS sucess_call_count,SUM(t.avg_ex_time) as avg_ex_time ");
        sb.append(" FROM tbl_merchant_api_analyze_detail t  ");
        sb.append(" WHERE t.app_key = ? ");
        sb.append(" AND t.time_quantum  like  ? ");
        Object[] values = { appKey, timeQuantum + "%" };
        List<Map<String, Object>> list = JDBCUtils.getInstance().listResultMap(sb.toString(), values);
        if (CollectionUtils.isNotEmpty(list)) {
            return list.get(0);
        }
        return null;
    }

    public List<Map<String, Object>> getApiKeyMetadata() {
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT t2.app_key,t1.metadata_key,t1.metadata_val ");
        sb.append(" FROM tbl_merchant_api_key_metadata t1 ");
        sb.append(" INNER JOIN tbl_merchant_api_key t2 ON t2.id = t1.key_id ");
        List<Map<String, Object>> list = JDBCUtils.getInstance().listResultMap(sb.toString());
        return list;
    }

    public void createAppKeyUserCache() throws Exception {
        String appKey = null;
        String metadataKey = null;
        String metadataVal = null;
        String appKeyUser = null;
        List<Map<String, Object>> list = this.getApiKeyMetadata();
        for (Map<String, Object> map : list) {
            appKey = MapUtils.getString(map, "app_key");
            metadataKey = MapUtils.getString(map, "metadata_key");
            metadataVal = MapUtils.getString(map, "metadata_val");
            if (StringUtils.equals(metadataKey, "MERCHANTS")) {
                try {
                    SupplierVo vo = supplierService.getSupplierByMerchantCode(metadataVal);
                    appKeyUser = vo.getSupplier();
                } catch (Exception e) {
                    //logger.info(" mct api"+metadataVal);
                    //System.out.println(metadataVal);
                    e.printStackTrace();
                }

            } else {
                try {
                    appKeyUser = apiDistributorService.queryAllDistributor().get(metadataVal);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    logger.error("dubbo??");
                }
            }
            if (StringUtils.isNotEmpty(appKeyUser)) {
                hashOperations.put(RedisKeyUtils.API_APPKEY_HASH, appKey, appKeyUser + "(" + metadataVal + ")");
            }

        }

    }

    public String getKeyUserByAppkey(String appKey) throws Exception {
        if (StringUtils.isNotEmpty(appKey)) {
            return hashOperations.get(RedisKeyUtils.API_APPKEY_HASH, appKey);
        } else {
            return "";
        }
    }

    public List<AppKeyMetadata> getAppkeyByUser(String appKeyUser) {
        Map<String, String> map = hashOperations.entries(RedisKeyUtils.API_APPKEY_HASH);
        List<AppKeyMetadata> list = new ArrayList<AppKeyMetadata>();
        Set<Entry<String, String>> set = map.entrySet();
        for (Entry<String, String> entity : set) {
            String key = entity.getKey();
            String value = entity.getValue();
            if (StringUtils.contains(value, appKeyUser)) {
                list.add(new AppKeyMetadata(key, value));
            }
        }
        return list;
    }

    public List<ApiMetadata> getApiMetadataByApiName(String apiName) {
        List<ApiMetadata> list = new ArrayList<ApiMetadata>();
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT t.id,t.api_name FROM tbl_merchant_api t");
        sb.append(" WHERE t.api_name LIKE ? ");
        Object[] values = { "%" + apiName + "%" };
        List<Map<String, Object>> mapList = JDBCUtils.getInstance().listResultMap(sb.toString(), values);
        if (CollectionUtils.isNotEmpty(mapList)) {
            for (Map<String, Object> map : mapList) {
                String id = MapUtils.getString(map, "id");
                String name = MapUtils.getString(map, "api_name");
                list.add(new ApiMetadata(id, name));
            }
        }
        return list;
    }

    @Override
    public List<ApiAnalyzeDetailVo> getApiAnalyzeDetailVoList(Date startTime, Date endTime) {

        BasicDBObject key = new BasicDBObject();
        BasicDBObject cond = new BasicDBObject();
        BasicDBObject conditionGroup = new BasicDBObject();
        BasicDBObject initial = new BasicDBObject();
        StringBuffer reduce = new StringBuffer();
        key.put("operationParameters.app_key", true);
        key.put("operationParameters.method", true);
        if (startTime != null) {
            conditionGroup.put("$gte", startTime);
        }
        if (endTime != null) {
            conditionGroup.put("$lte", endTime);
        }
        cond.put("operated", conditionGroup);
        initial.put("total", 0);
        initial.put("totalExTime", 0);
        initial.put("faleTotal", 0);

        reduce.append("function(curr,result){");
        reduce.append("result.totalExTime += curr.exTime;");
        reduce.append("result.total++;");
        reduce.append("if(curr.isCallSucess == false){");
        reduce.append("result.faleTotal++}}");

        DBObject dbObject = genericMongoDao.getDBObjectByGroup("tbl_merchant_api_log", key, cond, initial,
                reduce.toString());
        Gson gson = new Gson();
        Type type = new TypeToken<List<ApiAnalyzeDetailVo>>() {
        }.getType();
        //Gson ??xx.xx?????
        String jsonStr = dbObject.toString().replace("operationParameters.method", "api")
                .replace("operationParameters.app_key", "appKey");
        List<ApiAnalyzeDetailVo> list = gson.fromJson(jsonStr, type);
        return list;

    }

    @Override
    public String getMerchantCodeByappKey(String appKey) {
        String sql = "select m.metadata_val as merchant_code from tbl_merchant_api_key_metadata m, tbl_merchant_api_key k where m.key_id = k.id and m.metadata_key = 'MERCHANTS' AND k.app_key = ? ";
        Object[] values = { appKey };
        return (String) JDBCUtils.getInstance().uniqueResult(sql, values);
    }

    @Override
    public Integer getAppkeyCallCount(Date startDate, Date endDate, String appKey) {
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT SUM(t.call_count) ");
        sb.append(" FROM tbl_merchant_api_analyze_detail t ");
        sb.append(" WHERE t.time_quantum >= '" + df.format(startDate) + "' AND t.time_quantum < '"
                + df.format(endDate) + "'");
        sb.append(" AND t.app_key = '" + appKey + "'");
        Object result = JDBCUtils.getInstance().uniqueResult(sb.toString());
        if (result == null) {
            return 0;
        } else {
            Integer count = Integer.valueOf(result.toString());
            return count;
        }

    }

    @Override
    public Date getLastCallDate(Date startDate, Date endDate, String appKey) {
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT t.create_time FROM tbl_merchant_api_analyze_detail  t ");
        sb.append(" WHERE t.time_quantum >= '" + df.format(startDate) + "' AND t.time_quantum < '"
                + df.format(endDate) + "'");
        sb.append(" AND t.app_key = '" + appKey + "'");
        sb.append(" ORDER BY t.create_time DESC LIMIT 1 ");
        Object object = JDBCUtils.getInstance().uniqueResult(sb.toString());
        if (object == null) {
            return new Date();
        } else {
            Date date = (Date) JDBCUtils.getInstance().uniqueResult(sb.toString());
            return date;
        }

    }

    @Override
    public String getApiMethodById(String apiId) {
        StringBuffer sql = new StringBuffer("select t.api_method from tbl_merchant_api t where t.id = '");
        sql.append(apiId);
        sql.append("'");
        Object object = JDBCUtils.getInstance().uniqueResult(sql.toString());
        return (String) (object != null ? object : null);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<MonitorRateWarnDetail> getMonitorRateWarnByAppKey(String appKey) {
        Map<String, List<MonitorRateWarnDetail>> warnMaps = (Map<String, List<MonitorRateWarnDetail>>) this.redisTemplate
                .opsForValue().get(RedisKeyUtils.API_FREQUENCY_EARLY_WARN);
        if (MapUtils.isNotEmpty(warnMaps)) {
            return warnMaps.get(appKey);
        }

        return null;
    }

    /**
     * appkeyappkey?????
     * 
     * @param MonitorAppKeyVo
     * @return
     */
    public MonitorAppKeyVo queryMonitorAppKeyVo(String appkey) throws Exception {
        // ?AppKeyAppKeyId
        String appkeyId = apiMonitorService.queryAppKeyIdByAppKey(appkey);
        MonitorAppKeyVo vo = new MonitorAppKeyVo();
        Map<String, MonitorAppKeyDetailVo> detailmap = new HashMap<String, MonitorAppKeyDetailVo>();
        Map<String, Map<String, String>> map = (Map<String, Map<String, String>>) redisTemplate.opsForValue()
                .get(APPKEY_CONFIG_REDIS_KEY);
        String apiId = "";
        String detailKey = "";
        String[] detail;
        // appkey???
        if (!map.containsKey(appkeyId)) {
            appkeyId = "default";
        }
        for (String key : map.get(appkeyId).keySet()) {
            if ("dataFlow".equals(key)) {
                vo.setDataFlow(Integer.valueOf(map.get(appkeyId).get(key).toString()));
            } else if ("dataFlowEarlyWarn".equals(key)) {
                vo.setDataFlowEarlyWarn(Integer.valueOf(map.get(appkeyId).get(key).toString()));
            } else if ("successRate".equals(key)) {
                vo.setSuccessRate(Integer.valueOf(map.get(appkeyId).get(key).toString()));
            } else if ("invalidAppKeyRequest".equals(key)) {
                vo.setInvalidAppKeyRequest(Integer.valueOf(map.get(appkeyId).get(key).toString()));
            } else {
                detail = key.split("_");
                if (detail.length > 0) {
                    apiId = detail[0];
                    detailKey = detail[1];
                    if (!detailmap.containsKey(apiId)) {
                        detailmap.put(apiId, new MonitorAppKeyDetailVo());
                    } else if ("frequency".equals(detailKey)) {
                        detailmap.get(apiId).setFrequency(Integer.valueOf(map.get(appkeyId).get(key).toString()));
                    } else if ("frequencyUnit".equals(detailKey)) {
                        detailmap.get(apiId)
                                .setFrequencyUnit(Integer.valueOf(map.get(appkeyId).get(key).toString()));
                    } else if ("callNum".equals(detailKey)) {
                        detailmap.get(apiId).setCallNum(Integer.valueOf(map.get(appkeyId).get(key).toString()));
                    } else if ("dataFlowLimit".equals(detailKey)) {
                        detailmap.get(apiId)
                                .setDataFlowLimit(Integer.valueOf(map.get(appkeyId).get(key).toString()));
                    } else if ("frequencyLimit".equals(detailKey)) {
                        detailmap.get(apiId)
                                .setFrequencyLimit(Integer.valueOf(map.get(appkeyId).get(key).toString()));
                    } else if ("lockTime".equals(detailKey)) {
                        detailmap.get(apiId).setLockTime(Float.valueOf(map.get(appkeyId).get(key).toString()));
                    } else if ("dataFlowEarlyWarn".equals(detailKey)) {
                        detailmap.get(apiId)
                                .setDataFlowEarlyWarn(Integer.valueOf(map.get(appkeyId).get(key).toString()));
                    } else if ("frequencyEarlyWarn".equals(detailKey)) {
                        detailmap.get(apiId)
                                .setFrequencyEarlyWarn(Integer.valueOf(map.get(appkeyId).get(key).toString()));
                    }
                }
            }
        }
        vo.setMonitorAppKeyDetailVo(detailmap);
        return vo;
    }

    /**
     * ?API?
     * 
     * @param ApiMonitorParameterVo
     * @return
     */
    public ApiMonitorParameterVo getApiMonitorConfig() {
        ApiMonitorParameterVo vo = new ApiMonitorParameterVo();
        Map<String, String> map = (Map<String, String>) redisTemplate.opsForValue().get(API_CONFIG_REDIS_KEY);
        if (null != map) {
            vo.setDataFlowRate(map.get(Constant.DATA_FLOW_RATE));
            vo.setFrequencyRate(map.get(Constant.FREQUENCY_RATE));
            vo.setFrequencyOutLockTime(map.get(Constant.FREQUENCY_OUTLOCK_TIME));
            vo.setSimpleImplOneDayRate(map.get(Constant.SIMPLEIMPL_ONEDAY_RATE));
            vo.setSimpleImplFrequencyRate(map.get(Constant.SIMPLEIMPL_FREQUENCY_RATE));
            vo.setSuccessRate(map.get(Constant.SUCCESS_RATE));
            vo.setAppKeyCallFrequencyRate(map.get(Constant.APPKEY_CALLFREQUENCY_RATE));
            vo.setInvalidAppKeyRequest(map.get(Constant.INVALID_APPKEY_REQUEST));
        } else {
            List<MonitorConfig> configList = null;
            try {
                configList = apiMonitorService.queryMonitorConfigList();
            } catch (Exception e) {
                logger.error("?API???");
            }
            if (null != configList && configList.size() > 0) {
                for (MonitorConfig config : configList) {
                    if (config.getConfigKey().equals(Constant.KEY_DATA_FLOW_RATE)) {
                        vo.setDataFlowRate(config.getConfigValue());
                    } else if (config.getConfigKey().equals(Constant.KEY_FREQUENCY_RATE)) {
                        vo.setFrequencyRate(config.getConfigValue());
                    } else if (config.getConfigKey().equals(Constant.KEY_FREQUENCY_OUTLOCK_TIME)) {
                        vo.setFrequencyOutLockTime(config.getConfigValue());
                    } else if (config.getConfigKey().equals(Constant.KEY_SIMPLEIMPL_ONEDAY_RATE)) {
                        vo.setSimpleImplOneDayRate(config.getConfigValue());
                    } else if (config.getConfigKey().equals(Constant.KEY_SIMPLEIMPL_FREQUENCY_RATE)) {
                        vo.setSimpleImplFrequencyRate(config.getConfigValue());
                    } else if (config.getConfigKey().equals(Constant.KEY_SUCCESS_RATE)) {
                        vo.setSuccessRate(config.getConfigValue());
                    } else if (config.getConfigKey().equals(Constant.KEY_APPKEY_CALLFREQUENCY_RATE)) {
                        vo.setAppKeyCallFrequencyRate(config.getConfigValue());
                    } else if (config.getConfigKey().equals(Constant.KEY_INVALID_APPKEY_REQUEST)) {
                        vo.setInvalidAppKeyRequest(config.getConfigValue());
                    }
                }
            } else {
                // ???
                vo.setDataFlowRate("120");
                // ???
                vo.setFrequencyRate("120");
                // ???
                vo.setFrequencyOutLockTime("0");
                // ??
                vo.setSimpleImplOneDayRate("120");
                // ??
                vo.setSimpleImplFrequencyRate("120");
                // ?
                vo.setSuccessRate("80");
                // AppKey
                vo.setAppKeyCallFrequencyRate("120");
                // AppKey??IP?
                vo.setInvalidAppKeyRequest("1000");
            }
        }
        return vo;
    }

    /**
     * redis?appkey??
     * 
     * @return list
     */
    public List<String> updateRedisCasheForMonitorTemplate() {
        ApiMonitorParameterVo monitor = getApiMonitorConfig();
        Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();
        List<String> list = new ArrayList<String>();
        for (MonitorAppKeyTemplate temp : apiMonitorService.queryAppKeyTemplate()) {
            list.add(temp.getAppkeyId());
            map.put(temp.getAppkeyId(), getApiMonitorMap(temp.getTemplateNo(), monitor));
        }
        // ????
        String default_template_no = apiMonitorService.queryDefaultTemplate().get(0);
        list.add("default");
        map.put("default", getApiMonitorMap(default_template_no, monitor));
        redisTemplate.opsForValue().set(APPKEY_CONFIG_REDIS_KEY, map);
        return list;
    }

    private Map<String, String> getApiMonitorMap(String template_no, ApiMonitorParameterVo monitor) {
        Map<String, String> appkey_map = new HashMap<String, String>();
        appkey_map.put("successRate", monitor.getSuccessRate());
        appkey_map.put("invalidAppKeyRequest", monitor.getInvalidAppKeyRequest());
        int count = 0;
        for (MonitorTemplateDetail detail : apiMonitorService.queryTemplateDetailList(template_no)) {
            if (detail.getIsCallNum() == 1) {
                count = count + detail.getCallNum();
            }
            appkey_map.put(detail.getApiId() + "_frequency",
                    (detail.getIsFrequency() == 1 ? String.valueOf(detail.getFrequency()) : "-1"));
            appkey_map.put(detail.getApiId() + "_frequencyUnit", String.valueOf(detail.getFrequencyUnit()));
            appkey_map.put(detail.getApiId() + "_callNum",
                    (detail.getIsCallNum() == 1 ? String.valueOf(detail.getCallNum()) : "-1"));
            appkey_map.put(detail.getApiId() + "_dataFlowLimit", (detail.getIsCallNum() == 1 ? String.valueOf(
                    detail.getIsCallNum() * Integer.valueOf(monitor.getDataFlowRate().trim()) + detail.getCallNum())
                    : "-1"));
            appkey_map.put(detail.getApiId() + "_frequencyLimit",
                    (detail.getIsFrequency() == 1 ? String
                            .valueOf(detail.getFrequency() * Integer.valueOf(monitor.getFrequencyRate().trim())
                                    + detail.getFrequency())
                            : "-1"));
            appkey_map.put(detail.getApiId() + "_lockTime", monitor.getFrequencyOutLockTime());
            appkey_map
                    .put(detail.getApiId() + "_dataFlowEarlyWarn",
                            (detail.getIsCallNum() == 1 ? String.valueOf(
                                    detail.getCallNum() * Integer.valueOf(monitor.getSimpleImplOneDayRate().trim()))
                                    : "-1"));
            appkey_map.put(detail.getApiId() + "_frequencyEarlyWarn",
                    (detail.getIsFrequency() == 1 ? String.valueOf(
                            detail.getFrequency() * Integer.valueOf(monitor.getSimpleImplFrequencyRate().trim()))
                            : "-1"));
        }
        appkey_map.put("dataFlow", String.valueOf(count));
        appkey_map.put("dataFlowEarlyWarn",
                String.valueOf(count * Integer.valueOf(monitor.getAppKeyCallFrequencyRate().trim())));
        return appkey_map;
    }

    @Override
    public List<Map<String, Object>> findAppKeyByDate(Date startDate, Date endDate) {
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT t.app_key FROM tbl_merchant_api_analyze_ip t  ");
        sb.append(" WHERE t.time_quantum >= ? AND t.time_quantum < ? ");

        Object[] values = { df.format(startDate), df.format(endDate) };
        return JDBCUtils.getInstance().listResultMap(sb.toString(), values);
    }

    @Override
    public Integer findCallCountGroupByKey(Date startDate, Date endDate, String appKey) {

        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT SUM(t.call_count) as call_count from tbl_merchant_api_analyze_detail t  ");
        sb.append(" WHERE t.create_time >= ? AND t.create_time < ? ");
        sb.append(" AND t.app_key = ? ");

        Object[] values = { startDate, endDate, appKey };
        Object object = JDBCUtils.getInstance().uniqueResult(sb.toString(), values);
        if (object == null) {
            return 0;
        } else {
            return Integer.valueOf(object.toString());
        }
    }

    @Override
    public List<Map<String, Object>> findCallCountGroupByApi(Date startDate, Date endDate, String appKey) {
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT t.api_id,SUM(t.call_count) as call_count,SUM(t.sucess_call_count) as sucess_call_count");
        sb.append(" from tbl_merchant_api_analyze_detail t ");
        sb.append(" WHERE t.create_time >= ? AND t.create_time < ? ");
        sb.append(" AND t.app_key = ? ");
        sb.append(" GROUP BY t.api_id ");

        Object[] values = { startDate, endDate, appKey };
        return JDBCUtils.getInstance().listResultMap(sb.toString(), values);
    }

    @Override
    public List<Map<String, Object>> findCallCountGroupByApiAppKey(Date startDate, Date endDate) {
        StringBuffer sb = new StringBuffer();
        sb.append(" SELECT t.api_id,t.app_key,t.call_count ");
        sb.append(" FROM tbl_merchant_api_analyze_detail t  ");
        sb.append(" WHERE t.create_time >= ? AND t.create_time < ? ");
        sb.append(" GROUP BY t.api_id,t.app_key ");

        Object[] values = { startDate, endDate };
        return JDBCUtils.getInstance().listResultMap(sb.toString(), values);
    }

    @Override
    public Integer findCallCountByDateAndAppKey(Date startDate, Date endDate, String appKey) {
        StringBuffer sql = new StringBuffer();
        sql.append(" SELECT SUM(t.call_count)  ");
        sql.append(" FROM tbl_merchant_api_analyze_detail t  ");
        sql.append(" WHERE t.time_quantum >= ? AND t.time_quantum <= ? ");
        sql.append(" AND t.app_key = ? ");
        final List<Integer> list = jdbcTemplate.query(sql.toString(), new Object[] { startDate, endDate, appKey },
                new RowMapper<Integer>() {
                    @Override
                    public Integer mapRow(ResultSet rs, int rowNum) throws SQLException {
                        return rs.getInt(1);
                    }

                });
        if (CollectionUtils.isNotEmpty(list)) {
            return list.get(0);
        }
        return 0;
    }

    @Override
    public List<Map<String, Object>> findCountGroupByAppkey(Date startDate, Date endDate) {
        final List<Map<String, Object>> list = jdbcTemplate.queryForList(SQL_FINDCOUNTGROUPBYAPPKEY,
                new Object[] { startDate, endDate });
        if (CollectionUtils.isNotEmpty(list)) {
            return list;
        }
        return null;
    }

    @Override
    public List<String> findAppKeyForCountByDate(Date startDate, Date endDate) {
        StringBuffer sql = new StringBuffer();
        sql.append(" SELECT DISTINCT t.app_key  ");
        sql.append(" FROM tbl_merchant_api_analyze_detail t  ");
        sql.append(" WHERE t.time_quantum >= ? AND t.time_quantum <= ? ");
        final List<String> list = jdbcTemplate.query(sql.toString(), new Object[] { startDate, endDate },
                new RowMapper<String>() {
                    @Override
                    public String mapRow(ResultSet rs, int rowNum) throws SQLException {
                        return rs.getString(1);
                    }

                });
        return list;
    }

}