This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
k18-ntcs-web-argus-service/src/main/java/com/nis/web/service/restful/DashboardService.java
2019-01-05 18:02:57 +08:00

1703 lines
64 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.nis.web.service.restful;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
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;
import java.util.Map.Entry;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.beust.jcommander.internal.Maps;
import com.nis.domain.restful.NtcConnNumReport;
import com.nis.domain.restful.NtcEntranceReport;
import com.nis.domain.restful.dashboard.AppConnRecordStatistic;
import com.nis.domain.restful.dashboard.NtcTotalReport;
import com.nis.domain.restful.dashboard.TrafficAppFocusStatistic;
import com.nis.domain.restful.dashboard.TrafficAppStatistic;
import com.nis.domain.restful.dashboard.TrafficHttpFocusStatistic;
import com.nis.domain.restful.dashboard.TrafficIpActiveStatistic;
import com.nis.domain.restful.dashboard.TrafficPortActiveStatistic;
import com.nis.domain.restful.dashboard.TrafficProtocolStatistic;
import com.nis.domain.restful.dashboard.TrafficTransStatistic;
import com.nis.domain.restful.dashboard.TrafficUaStatistic;
import com.nis.restful.RestBusinessCode;
import com.nis.restful.RestServiceException;
import com.nis.util.Constants;
import com.nis.util.DateUtils;
import com.nis.util.StringUtils;
import com.nis.web.dao.dashboard.NtcTotalReportDao;
import com.nis.web.dao.dashboard.TrafficAppStatisticDao;
import com.nis.web.dao.dashboard.TrafficHttpStatisticDao;
import com.nis.web.dao.dashboard.TrafficIpActiveStatisticDao;
import com.nis.web.dao.dashboard.TrafficPortActiveStatisticDao;
import com.nis.web.dao.dashboard.TrafficProtocolStatisticDao;
import com.nis.web.dao.dashboard.TrafficUaStatisticDao;
import com.nis.web.service.BaseService;
import com.zdjizhi.utils.StringUtil;
@Service
public class DashboardService extends BaseService {
@Autowired
public TrafficIpActiveStatisticDao trafficIpActiveStatisticDao;
@Autowired
public TrafficProtocolStatisticDao trafficProtocolStatisticDao;
@Autowired
public TrafficAppStatisticDao trafficAppStatisticDao;
@Autowired
public TrafficUaStatisticDao trafficUaStatisticDao;
@Autowired
public TrafficHttpStatisticDao trafficHttpStatisticDao;
@Autowired
public NtcTotalReportDao ntcTotalReportDao;
@Autowired
public TrafficPortActiveStatisticDao trafficPortActiveStatisticDao;
/**
* 流量统计 数据显示 info先查询最近时间根据时间条件查询数据 效率提高
*/
public List<Map> getTotalReportList() {
List<Map> totalReportList = new ArrayList<Map>();
List<Map> newData = new ArrayList<Map>();
// 流量统计阻断丢弃回流等数据显示最近时间
NtcTotalReport maxReportTime = ntcTotalReportDao.getMaxReportTime();
if (maxReportTime != null && maxReportTime.getReportTime() != null) {
Date reportTime = maxReportTime.getReportTime();
totalReportList = ntcTotalReportDao.getTotalReportList(reportTime);// 返回阻断,监测等結果
}
Map maxRecvtTime = ntcTotalReportDao.getMaxStatTime();
if (maxRecvtTime != null && maxRecvtTime.get("statTime") != null) {
Date recvTime = (Date) maxRecvtTime.get("statTime");
newData = ntcTotalReportDao.getNetFlowPortInfoNew(recvTime);
}
// 统计带宽的流入流出 单位 五分钟 的 byte
if (StringUtil.isNotEmpty(newData)) {
Double inoctets = Double.parseDouble(newData.get(0).get("inoctets").toString());
Double outoctets = Double.parseDouble(newData.get(0).get("outoctets").toString());
if (StringUtil.isEmpty(totalReportList)) {
Map valueMap = Maps.newHashMap();
valueMap.put("inoctets", inoctets);
valueMap.put("outoctets", outoctets);
totalReportList.add(valueMap);
} else {
totalReportList.get(0).put("inoctets", inoctets);
totalReportList.get(0).put("outoctets", outoctets);
}
}
return totalReportList;
}
/**
* 根据ip46,协议tcpudp查询带宽
*
* @param addrType
* @param transType
* @return
*/
/*
* public List<HashMap> getBandwidthTrans(String addrType, Integer
* transType,String beginDate,String endDate) { ArrayList<HashMap> listMap = new
* ArrayList<HashMap>(); List<TrafficTransStatistic> bandwidthList = new
* ArrayList<TrafficTransStatistic>(); Map maxStatTime =
* ntcTotalReportDao.getMaxStatTime(); if (maxStatTime != null &&
* maxStatTime.get("statTime") != null) { Date stat = (Date)
* maxStatTime.get("statTime"); HashMap m = new HashMap(); bandwidthList =
* ntcTotalReportDao.getBandwidthTrans(stat, addrType, transType); List timeList
* = new ArrayList(); List linkList = new ArrayList(); List gbpsList = new
* ArrayList(); List ppsList = new ArrayList(); if (bandwidthList != null &&
* bandwidthList.size() > 0) { for (TrafficTransStatistic tt : bandwidthList) {
* if (tt.getTime() != null) { timeList.add(tt.getTime()); if (tt.getLinkNum()
* != null) { linkList.add(tt.getLinkNum()); } if (tt.getPps() != null) {
* ppsList.add(tt.getPps()); } if (tt.getGbps() != null) {
* gbpsList.add(tt.getGbps()); } } } } m.put("linkNum", linkList); m.put("gbps",
* gbpsList); m.put("pps", ppsList); m.put("statTime", timeList);
* listMap.add(m); } return listMap; }
*/
/**
* 根据ip46,协议tcpudp查询带宽
*
* @param addrType
* @param transType
* @return
*/
@Deprecated
public List<HashMap> getBandwidthTrans(String addrType, Integer transType, String beginDate, String endDate) {
ArrayList<HashMap> listMap = new ArrayList<HashMap>();
HashMap m1 = getBandwidthTransEntrance(addrType, transType, beginDate, endDate, 1);
if (m1 != null && m1.size() > 0) {
m1.put("entranceId", 1);// 局点1.2 不同来源
listMap.add(m1);
}
return listMap;
}
/**
* 根据ip46,协议tcpudp查询带宽
*
* @param addrType
* @param transType
* @return
*/
@Deprecated
public List<HashMap> getBandwidthTrans2(String addrType, Integer transType, String beginDate, String endDate) {
ArrayList<HashMap> listMap = new ArrayList<HashMap>();
HashMap m2 = getBandwidthTransEntrance(addrType, transType, beginDate, endDate, 2);
if (m2 != null && m2.size() > 0) {
m2.put("entranceId", 2);
listMap.add(m2);
}
return listMap;
}
/**
* 查询单个局点流量的数据信息
*
* @param addrType
* @param transType
* @param beginDate
* @param endDate
* @param entranceId
* @return
*/
@Deprecated
public HashMap getBandwidthTransEntrance(String addrType, Integer transType, String beginDate, String endDate,
Integer entranceId) {
long start = System.currentTimeMillis();
ArrayList<HashMap> listMap = new ArrayList<HashMap>();
List<TrafficTransStatistic> bandwidthList = new ArrayList<TrafficTransStatistic>();
HashMap resulMap = new HashMap();
bandwidthList = ntcTotalReportDao.getBandwidthTrans(entranceId, beginDate, endDate, addrType, transType);
List timeList = new ArrayList();
List linkList = new ArrayList();
List gbpsList = new ArrayList();
List ppsList = new ArrayList();
if (bandwidthList != null && bandwidthList.size() > 0) {
Map<String, Comparable> m = new HashMap<String, Comparable>();
int inter = 1000 * 60 * 5;// 间隔时间为五分钟
// 开始时间,结束时间 时间戳
Long b = dateToStamp(beginDate);
Long e = dateToStamp(endDate);
int num = 0;
Long pointTime = b;
while (pointTime < e) {
Map rm = new HashMap();
Long sumL = 0l;
Long sumP = 0l;
Long sumG = 0l;
if (pointTime >= e) {
break; // 停止
}
for (TrafficTransStatistic tt : bandwidthList) {
// 实际时间
String time = tt.getTime();
Long t = dateToStamp(time);
if (t >= pointTime && t < pointTime + inter) {
// 范围之内分到此pointTime组
sumL = sumL + tt.getLinkNum();
sumP = sumP + Long.parseLong(tt.getPps().substring(0, tt.getPps().lastIndexOf(".")));
sumG = sumG + Long.parseLong(tt.getGbps().substring(0, tt.getGbps().lastIndexOf(".")));
}
}
// 在结束时间只有当值大于0时才记录数据防止折线降为0引起误会
if (pointTime >= e - inter && sumL > 0) {
linkList.add(sumL);
}
if (pointTime >= e - inter && sumP > 0) {
ppsList.add(sumP);
}
if (pointTime >= e - inter && sumG > 0) {
gbpsList.add(sumG);
}
if (pointTime >= e - inter && (sumL > 0 || sumG > 0 || sumP > 0)) {
timeList.add(stampToDate(pointTime));
}
if (pointTime < e - inter) {
timeList.add(stampToDate(pointTime));
linkList.add(sumL);
gbpsList.add(sumG);
ppsList.add(sumP);
}
num = num + 1;
pointTime = b + inter * num;
}
resulMap.put("linkNum", linkList);
resulMap.put("gbps", gbpsList);
resulMap.put("pps", ppsList);
resulMap.put("statTime", timeList);
}
return resulMap;
}
/**
* 将结果格式为时间间隔相同数量补0数据
*
* @param begin
* @param end
* @param li
* @return
*/
@Deprecated
public static List<Map> formatDateData(String begin, String end, List<Map> li) {
List<Map> resList = new ArrayList<Map>();
Map<String, Comparable> m = new HashMap<String, Comparable>();
int inter = 1000 * 60 * 60;// 间隔时间为一小时
// 开始时间,结束时间 时间戳
Long b = dateToStamp(begin);
Long e = dateToStamp(end);
int num = 0;
Long pointTime = b;
while (pointTime < e) {
Map rm = new HashMap();
Long sum = 0l;
if (pointTime >= e) {
break; // 停止
}
for (Map<?, ?> map : li) {
// 实际时间
String time = (String) map.get("time");
Long t = dateToStamp(time);
if (t >= pointTime && t < pointTime + inter) {
// 范围之内分到此pointTime组
sum = sum + (Long) map.get("count");
}
}
rm.put("time", stampToDate(pointTime));
rm.put("sum", sum);
num = num + 1;
pointTime = b + inter * num;
resList.add(rm);
}
return resList;
}
/**
* 日期格式字符串转换成时间戳
*
* @param date 字符串日期
* @param format 如yyyy-MM-dd HH:mm:ss
* @return
*/
@Deprecated
public static Long dateToStamp(String date_str) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.parse(date_str).getTime();
} catch (Exception e) {
e.printStackTrace();
}
return 0l;
}
/**
* 时间戳 换成日期格式字符串转
*
* @param 时间 1544602212000
* @param format 如yyyy-MM-dd HH:mm:ss
* @return
*/
@Deprecated
public static String stampToDate(long timeStamp) {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");// 这个是你要转成后的时间的格式
String sd = sdf.format(new Date(timeStamp)); // 时间戳转换成时间
return sd;
}
/**
* 根据service 动作查询近五分钟变化趋势 entrance 默认为1,2
*/
/*
* public List<HashMap> getActionTrans(String begin, String end, String
* serviceType) { String sql = ""; String sqlBlock =
* "((service>=16 and service<=40) or (service>=258 and service<=273) or (service=576))"
* ; // 阻断 String sqlMonitor =
* "((service>=128 and service<=152) or (service>=384 and service<=513) or (service=592) or (service>=848 and service<=1030) or (service=1152))"
* ; // 监测 String sqlDrop =
* "((service>=1040 and service<=1042) or (service=3) or (service=5) or (service=25) or (service=28) or (service=274))"
* ; // 丢弃 String sqlLoop = "((service=4) or (service>=832 and service<=834))";
* // 回流 // 区分动作 if (StringUtils.isNotBlank(serviceType)) { if
* (serviceType.equalsIgnoreCase("block")) { sql = sqlBlock; } if
* (serviceType.equalsIgnoreCase("monitor")) { sql = sqlMonitor; } if
* (serviceType.equalsIgnoreCase("drop")) { sql = sqlDrop; } if
* (serviceType.equalsIgnoreCase("loop")) { sql = sqlLoop; } }
* ArrayList<HashMap> listMap = new ArrayList<HashMap>();
* List<NtcEntranceReport> entrance1 = new ArrayList<NtcEntranceReport>();
* List<NtcEntranceReport> entrance2 = new ArrayList<NtcEntranceReport>();
* HashMap m1 = new HashMap(); HashMap m2 = new HashMap(); entrance1 =
* ntcTotalReportDao.getActionTrans(begin, end, 1, sql); entrance2 =
* ntcTotalReportDao.getActionTrans(begin, end, 2, sql); List timeList = new
* ArrayList(); List sumList1 = new ArrayList(); List sumList2 = new
* ArrayList();
*
* Map<String, Comparable> m = new HashMap<String, Comparable>(); int inter =
* 1000 * 60 * 5;// 间隔时间为五分钟 // 开始时间,结束时间 时间戳 Long b = dateToStamp(begin); Long
* e = dateToStamp(end); int num = 0; Long pointTime = b; while (pointTime < e)
* { Map rm = new HashMap(); Long sum1 = 0l; Long sum2 = 0l; if (pointTime >= e)
* { break; // 停止 } for (NtcEntranceReport e1 : entrance1) { // 实际时间 String time
* = e1.getTime(); Long t = dateToStamp(time); if (t >= pointTime && t <
* pointTime + inter) { // 范围之内分到此pointTime组 sum1 = sum1 + e1.getSum(); } } for
* (NtcEntranceReport e2 : entrance2) { // 实际时间 String time = e2.getTime(); Long
* t = dateToStamp(time); if (t >= pointTime && t < pointTime + inter) { //
* 范围之内分到此pointTime组 sum2 = sum2 + e2.getSum(); } } //
* 在结束时间只有当值大于0时才记录数据防止折线降为0引起误会 if (pointTime >= e - inter && sum1 > 0) {
* sumList1.add(sum1); } if (pointTime >= e - inter && sum2 > 0) {
* sumList2.add(sum2); } if (pointTime >= e - inter && (sum1 > 0 || sum2 > 0)) {
* timeList.add(stampToDate(pointTime)); } if (pointTime < e - inter) {
* sumList1.add(sum1); sumList2.add(sum2); timeList.add(stampToDate(pointTime));
* } num = num + 1; pointTime = b + inter * num; } m1.put("count", sumList1);
* m1.put("statTime", timeList); m1.put("entranceId", 1); m2.put("count",
* sumList2);// m2.put("statTime", timeList); m2.put("entranceId", 2);
* listMap.add(m1); listMap.add(m2); return listMap; }
*/
/**
* 根据service 动作查询近五分钟变化趋势 entrance 默认为1,2
*/
public List<HashMap> getActionTrans2(String begin, String end, String serviceType) {
String sql = "";
String sqlBlock = "((service>=16 and service<=40) or (service>=258 and service<=273) or (service=576))"; // 阻断
String sqlMonitor = "((service>=128 and service<=152) or (service>=384 and service<=513) or (service=592) or (service>=848 and service<=1030) or (service=1152))"; // 监测
String sqlDrop = "((service>=1040 and service<=1042) or (service=3) or (service=5) or (service=25) or (service=28) or (service=274))"; // 丢弃
String sqlLoop = "((service=4) or (service>=832 and service<=834))"; // 回流
// 区分动作
if (StringUtils.isNotBlank(serviceType)) {
if (serviceType.equalsIgnoreCase("action_reject")) {
sql = sqlBlock;
}
if (serviceType.equalsIgnoreCase("action_monit")) {
sql = sqlMonitor;
}
if (serviceType.equalsIgnoreCase("action_drop")) {
sql = sqlDrop;
}
if (serviceType.equalsIgnoreCase("action_loop")) {
sql = sqlLoop;
}
}
ArrayList<HashMap> listMap = new ArrayList<HashMap>();
List<NtcEntranceReport> entrance1 = new ArrayList<NtcEntranceReport>();
List<NtcEntranceReport> entrance2 = new ArrayList<NtcEntranceReport>();
HashMap m1 = new HashMap();
HashMap m2 = new HashMap();
entrance1 = ntcTotalReportDao.getActionTrans(begin, end, 1, sql);
entrance2 = ntcTotalReportDao.getActionTrans(begin, end, 2, sql);
if(!StringUtil.isEmpty(entrance1)||!StringUtil.isEmpty(entrance2)){
Map<String, Comparable> m = new HashMap<String, Comparable>();
Date beginDate = DateUtils.parseDate(begin);
Date endDate = DateUtils.parseDate(end);
List<Date> dateRangeList = new ArrayList<Date>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(beginDate);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (calendar.getTime().compareTo(endDate) < 0) {
dateRangeList.add(calendar.getTime());
calendar.add(Calendar.MINUTE, Constants.TREND_TIME_INTERVAL);
}
// 存放每个时间点的总数
Map<String, List<Long>> ipCountListMap = new HashMap<String, List<Long>>();
int index1 = 0;
int index2 = 0;
List sumList1 = new ArrayList();
List sumList2 = new ArrayList();
Long sumEnt1 = 0L;
Long sumEnt2 = 0L;
for (int i = 0; i < dateRangeList.size(); i++) {
// 存放一个时间点中总数
List listEnt1 = new ArrayList();
List listEnt2 = new ArrayList();
Map<String, Long> ipCountMap = new HashMap<String, Long>();
Date date = dateRangeList.get(i);
Long num1 = 0L;
Long num2 = 0L;
for (int j = index1; j < entrance1.size(); j++) {
NtcEntranceReport ipInfo = entrance1.get(j);
if (ipInfo.getReportTime() != null) {
if (ipInfo.getReportTime().compareTo(date) >= 0 && (i + 1 < dateRangeList.size()?ipInfo.getReportTime().compareTo(dateRangeList.get(i + 1)) < 0:true)) {
num1 = num1 + ipInfo.getSum();
} else {
index1 = j;
break;
}
}
}
sumEnt1+=num1;
listEnt1.add(date.getTime());
listEnt1.add(num1);
sumList1.add(listEnt1);
for (int j = index2; j < entrance2.size(); j++) {
NtcEntranceReport ipInfo = entrance2.get(j);
if (ipInfo.getReportTime() != null) {
if (ipInfo.getReportTime().compareTo(date) >= 0 && (i + 1 < dateRangeList.size()?ipInfo.getReportTime().compareTo(dateRangeList.get(i + 1)) < 0:true)) {
num2 = num2 + ipInfo.getSum();
} else {
index2 = j;
break;
}
}
}
sumEnt2+=num2;
listEnt2.add(date.getTime());
listEnt2.add(num2);
sumList2.add(listEnt2);
}
// 整合 count time
m1.put("sum", sumEnt1);
m1.put("result", sumList1);
m1.put("entranceId", 1);
m2.put("sum", sumEnt2);//
m2.put("result", sumList2);
m2.put("entranceId", 2);
listMap.add(m1);
listMap.add(m2);
}
return listMap;
}
/**
* 最近活跃端口时间五分钟数据
*
* @return List
*/
public List<Map> getPortActiveList() {
List<Map> list = new ArrayList<Map>();
TrafficPortActiveStatistic maxStatTime = trafficPortActiveStatisticDao.getMaxStatTime();
if (maxStatTime != null && maxStatTime.getStatTime() != null) {
Date statTime = maxStatTime.getStatTime();
List<TrafficPortActiveStatistic> portActiveList = trafficPortActiveStatisticDao.getPortActiveList(statTime);
// 上个时间五分钟数据
if (portActiveList != null && portActiveList.size() > 0) {
for (TrafficPortActiveStatistic port : portActiveList) {
if (port.getPort() != null) {
Map map = new HashMap();
map.put("port", port.getPort());
map.put("sum", port.getSum());
TrafficPortActiveStatistic portActiveOld = trafficPortActiveStatisticDao
.getPortActiveOld(port.getPort(), statTime);
if (portActiveOld != null && portActiveOld.getSum() != null) {
map.put("preSum", portActiveOld.getSum());
} else {
map.put("preSum", 0);
}
list.add(map);
}
}
}
}
return list;
}
/**
* 活跃IP最近五分钟数据TOP10
*
* @return
*/
/*
* public List<HashMap> ipActiveFiveMinute(Date beginDate,Date endDate) {
* TrafficIpActiveStatistic maxStatTime =
* trafficIpActiveStatisticDao.getMaxStatTime(); ArrayList<HashMap> listMap =
* new ArrayList<HashMap>(); if (maxStatTime != null &&
* maxStatTime.getStatTime() != null) { Date statTime =
* maxStatTime.getStatTime(); // 查询最近五分钟TOP10 ArrayList<LinkedHashMap>
* ipListTop10 = trafficIpActiveStatisticDao.ipActiveChart(beginDate,endDate);
* if (ipListTop10 != null && ipListTop10.size() > 0) { for (LinkedHashMap map :
* ipListTop10) { HashMap m = new HashMap(); if (map.get("ipAddr") != null) {
* String ipAddr = (String) map.get("ipAddr"); m.put("ipAddr", ipAddr); //
* 根据五分钟TOP10IP查询TOP10中每个IP最近一小时的变化 long beforeTime = beginDate.getTime(); long
* afterTime = endDate.getTime(); Long inter=(afterTime - beforeTime) / (1000 *
* 60 * 5); ArrayList<TrafficIpActiveStatistic> ipList =
* trafficIpActiveStatisticDao.ipActiveFiveMinute(inter,ipAddr,
* beginDate,endDate); List linkList = new ArrayList(); List timeList = new
* ArrayList(); if (ipList != null && ipList.size() > 0) { for
* (TrafficIpActiveStatistic ip : ipList) { if (ip.getLinkNum() != null &&
* ip.getTime() != null) { linkList.add(ip.getLinkNum());
* timeList.add(ip.getTime()); } } } m.put("linkNum", linkList);
* m.put("statTime", timeList); listMap.add(m); } } } }
*
* return listMap; }
*/
/**
* 获取活跃IPtop10 的趋势图
*/
public List<Map> ipActiveFiveMinute(Date beginDate, Date endDate) {
List<Map> listMap = new ArrayList<Map>();
List<LinkedHashMap> ipListTop10 = trafficIpActiveStatisticDao.ipActiveChart(beginDate, endDate);
if (ipListTop10 != null && ipListTop10.size() > 0) {
StringBuilder ipStr = new StringBuilder();
for (LinkedHashMap map : ipListTop10) {
ipStr.append("'" + (String) map.get("ipAddr") + "',");
}
if (!StringUtil.isEmpty(ipStr) && ipStr.indexOf(",") > 0) {
ipStr.deleteCharAt(ipStr.lastIndexOf(","));
}
// 如果所有IP在最后一个时间点的count都为0则移除最后一个点
// 开始划分时间段,间隔5分钟
List<Date> dateRangeList = new ArrayList<Date>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(beginDate);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (calendar.getTime().compareTo(endDate) < 0) {
dateRangeList.add(calendar.getTime());
calendar.add(Calendar.MINUTE, Constants.TREND_TIME_INTERVAL);
}
ArrayList<TrafficIpActiveStatistic> ipInfoList = trafficIpActiveStatisticDao
.ipActiveFiveMinute(ipStr.toString(), beginDate, endDate);
// 存放每个IP每个时间点的总数
Map<String, List> ipCountListMap = new HashMap<String, List>();
int index = 0;
for (int i = 0; i < dateRangeList.size(); i++) {
// 存放一个时间点中每个IP的总数
Map<String, Long> ipCountMap = new HashMap<String, Long>();
Date date = dateRangeList.get(i);
for (int j = index; j < ipInfoList.size(); j++) {
TrafficIpActiveStatistic ipInfo = ipInfoList.get(j);
if (ipInfo.getStatTime() != null) {
if (ipInfo.getStatTime().compareTo(date) >= 0 && (i + 1 < dateRangeList.size()
&& ipInfo.getStatTime().compareTo(dateRangeList.get(i + 1)) < 0)) {
Long num = ipInfo.getCount();
if (ipCountMap.containsKey(ipInfo.getIpAddr())) {
num = num + ipCountMap.get(ipInfo.getIpAddr());
}
ipCountMap.put(ipInfo.getIpAddr(), num);
} else {
index = j;
break;
}
}
}
for (LinkedHashMap map : ipListTop10) {
String ip = (String) map.get("ipAddr");
List sumList= new ArrayList();
sumList.add(date.getTime());
Long sum = 0l;
if (ipCountMap.containsKey(ip)) {
sum = ipCountMap.get(ip);
}
sumList.add(sum);
if (ipCountListMap.containsKey(ip)) {
List ipList = ipCountListMap.get(ip);
ipList.add(sumList);
} else {
List iplist = new ArrayList();
iplist.add(sumList);
ipCountListMap.put(ip, iplist);
}
}
}
// 整合IP计算总数
Iterator iterator = ipCountListMap.keySet().iterator();
while (iterator.hasNext()) {
String ip = iterator.next() + "";
Map ipTrafficMap = new HashMap();
ipTrafficMap.put("ipAddr", ip);
Long total = 0L;
for (Object obj : ipCountListMap.get(ip)) {
List<Long> list = (List) obj;
total+=list.get(1);
}
ipTrafficMap.put("result", ipCountListMap.get(ip));
ipTrafficMap.put("sum", total);
listMap.add(ipTrafficMap);
}
}
return listMap;
}
/**
* 根据活跃IP最近五分钟TOP10查询近1小时最大值
*
* @return
*/
public List<HashMap> ipActiveOneHour(Date beginDate, Date endDate) {
// TrafficIpActiveStatistic maxStatTime = trafficIpActiveStatisticDao.getMaxStatTime();
ArrayList<HashMap> listMap = new ArrayList<HashMap>();
// if (maxStatTime != null && maxStatTime.getStatTime() != null) {
// Date statTime = maxStatTime.getStatTime();
ArrayList<LinkedHashMap> list = trafficIpActiveStatisticDao.ipActiveChart(beginDate, endDate);
if (list != null && list.size() > 0) {
for (LinkedHashMap map : list) {
if (map.get("ipAddr") != null) {
String ipAddr = (String) map.get("ipAddr");
HashMap resMap = trafficIpActiveStatisticDao.ipActiveOneHour(ipAddr, beginDate, endDate);
if (resMap != null) {
listMap.add(resMap);
}
}
}
}
// }
return listMap;
}
/**
* 活跃IP首页top10
*
* @param beginDate
* @param endDate
* @return
*/
@SuppressWarnings("rawtypes")
public List<LinkedHashMap> ipActiveChart(Date beginDate, Date endDate) {
// TrafficIpActiveStatistic maxStatTime = trafficIpActiveStatisticDao.getMaxStatTime();
ArrayList<LinkedHashMap> list = new ArrayList<>();
// if (maxStatTime != null && maxStatTime.getStatTime() != null) {
// Date statTime = maxStatTime.getStatTime();
list = trafficIpActiveStatisticDao.ipActiveChart(beginDate, endDate);
if (list != null && list.size() > 0) {
for (LinkedHashMap map : list) {
if (map.get("ipAddr") != null) {
Map m = new LinkedHashMap();
map.put("pktNum", 0);
map.put("byteLen", 0);
}
}
}
// }
return list;
}
/**
* 协议统计
*
* @return
*/
public List<Map> protocolChart() {
TrafficProtocolStatistic maxStatTime = trafficProtocolStatisticDao.getMaxStatTime();
List<Map> list = new ArrayList<Map>();
if (maxStatTime != null && maxStatTime.getStatTime() != null) {
Date statTime = maxStatTime.getStatTime();
list = trafficProtocolStatisticDao.protocolChart(statTime);
// 当不查询包,字节时 设为0
if (list != null && list.size() > 0) {
Map map = new HashMap();
map.put("pktNum", 0);
map.put("byteLen", 0);
}
}
return list;
}
/**
* 协议统计报表
*
* @return
*/
public List<Map> getProtocolList(String startTime, String endTime, Integer[] protoType) {
// TrafficProtocolStatistic maxStatTime = trafficProtocolStatisticDao.getMaxStatTime();
List<Map> list = new ArrayList<Map>();
// if (maxStatTime != null && maxStatTime.getStatTime() != null) {
// Date statTime = maxStatTime.getStatTime();
list = trafficProtocolStatisticDao.getProtocolList(startTime, endTime, protoType);
// }
return list;
}
/**
* app应用top10 图
*
* @return
*/
public List<Map> appChart() {
List<Map> list = new ArrayList<Map>();
TrafficAppStatistic maxStatTime = trafficAppStatisticDao.getMaxStatTime();
if (maxStatTime != null && maxStatTime.getStatTime() != null) {
Date statTime = maxStatTime.getStatTime();
list = trafficAppStatisticDao.appChart(statTime);
// 当不查询包,字节时 设为0
if (list != null && list.size() > 0) {
Map map = new HashMap();
map.put("pktNum", 0);
map.put("byteLen", 0);
}
}
return list;
}
/**
* App统计报表
*
* @return
*/
public List<Map> getAppList(String startTime, String endTime, Integer[] appType) {
// TrafficAppStatistic maxStatTime = trafficAppStatisticDao.getMaxStatTime();
List<Map> list = new ArrayList<Map>();
// if (maxStatTime != null && maxStatTime.getStatTime() != null) {
// Date statTime = maxStatTime.getStatTime();
list = trafficAppStatisticDao.getAppList(startTime, endTime, appType);
// }
return list;
}
// 操作系统列表 排名TOP10
@SuppressWarnings({ "unchecked", "rawtypes" })
public List<Map> systemList() {
List<Map> result = new ArrayList<Map>();
TrafficUaStatistic maxStatTime = trafficUaStatisticDao.getMaxStatTime();
if (maxStatTime != null) {
Date statTime = maxStatTime.getStatTime();
List<TrafficUaStatistic> list = trafficUaStatisticDao.systemList(statTime);
Long preCount = 0l;
for (TrafficUaStatistic ua : list) {
Map map = new HashMap();
map.put("osType", ua.getOsType());
map.put("count", ua.getCount());
map.put("pktNum", 0);
map.put("byteLen", 0);
preCount = trafficUaStatisticDao.preSystemListCount(ua.getOsType(), statTime);// 上个时段的量 用于与现在对比
if (preCount != null) {
map.put("preCount", preCount);
} else {
map.put("preCount", 0);
}
result.add(map);
}
}
return result;
}
public List<Map> getBrowserBySystem(Integer osType) {
List<Map> list = new ArrayList<Map>();
TrafficUaStatistic maxStatTime = trafficUaStatisticDao.getMaxStatTime();
if (maxStatTime != null) {
Date statTime = maxStatTime.getStatTime();
list = trafficUaStatisticDao.getBrowserBySystem(osType, statTime);
List bsType = new ArrayList();
// 查新固定操系统下的除了TOP10以外的others
if (list != null && list.size() > 0) {
for (Map map : list) {
bsType.add(map.get("bsType"));
}
if (list.size() > 10) {
Map others = new HashMap();
others = trafficUaStatisticDao.systemOthers(bsType, osType, statTime);
if (others != null && others.size() > 0) {
others.put("bsType", "-1");
list.add(others);
}
}
}
}
return list;
}
public List<Map> browserList() {
List<Map> result = new ArrayList<Map>();
TrafficUaStatistic maxStatTime = trafficUaStatisticDao.getMaxStatTime();
if (maxStatTime != null) {
Date statTime = maxStatTime.getStatTime();
List<TrafficUaStatistic> list = trafficUaStatisticDao.browserList(statTime);
Long preCount = 0l;
if (list != null && list.size() > 0) {
for (TrafficUaStatistic ua : list) {
Map map = new HashMap();
map.put("bsType", ua.getBsType());
map.put("count", ua.getCount());
map.put("pktNum", 0);
map.put("byteLen", 0);
preCount = trafficUaStatisticDao.preBrowserListCount(ua.getBsType(), statTime);// 上个时段的量 用于与现在对比
if (preCount != null) {
map.put("preCount", preCount);
} else {
map.put("preCount", 0);
}
result.add(map);
}
}
}
return result;
}
public List<Map> getSystemBybrowser(Integer bsType) {
List<Map> list = new ArrayList<Map>();
TrafficUaStatistic maxStatTime = trafficUaStatisticDao.getMaxStatTime();
if (maxStatTime != null) {
Date statTime = maxStatTime.getStatTime();
list = trafficUaStatisticDao.getSystemBybrowser(bsType, statTime);
List osType = new ArrayList();
// 查询固定操系统下的除了TOP10以外的others
if (list != null && list.size() > 0) {
for (Map map : list) {
osType.add(map.get("osType"));
}
if (list.size() > 10) {
Map others = new HashMap();
others = trafficUaStatisticDao.browserOthers(osType, bsType, statTime);
if (others != null && others.size() > 0) {
others.put("osType", "-1");
list.add(others);
}
}
}
}
return list;
}
/**
*
* 网站子域名详情
*
* @param beginDate
* @param endDate
* @return
*/
public List<Map> getWebsiteDetailsById(Integer websiteServiceId, Date beginDate, Date endDate) {
List<Map> list = null;
if (beginDate != null && endDate != null) {
list = getDomainByWebsiteServiceId(websiteServiceId, beginDate, endDate, null);
} else {
Date startTime = getBeforeByHourTime(1);// 获取上一个小时
list = getDomainByWebsiteServiceId(websiteServiceId, startTime, new Date(), "top");
}
return list;
}
/**
* 根据网站服务查询子域名
*
* @param websiteServiceId
* @return list
*/
public List<Map> getDomainByWebsiteServiceId(Integer websiteServiceId, Date beginDate, Date endDate, String top) {
// Date statTime = getBeforeByHourTime(1);// 获取上一个小时
List idList = trafficHttpStatisticDao.getIdByWebSiteId(websiteServiceId);
List<Map> matchList = trafficHttpStatisticDao.getDomainByWebsiteServiceId(idList, beginDate, endDate);// 获取webid和count的对应关系,key是webid,val是count
// 获取webid和count的对应关系,key是webid,val是count
Set<Long> set = new HashSet<>();
Map<Long, List<Map>> countMap = new HashMap();// 存储count和map的对应关系,后面根据count过滤,获取top10的count
for (Map map : matchList) {
String countStr = String.valueOf(map.get("count"));
long count = Long.parseLong(countStr);
set.add(count);
if (countMap.containsKey(count)) {// 将每个count和对应的viewmap放到map中,count可能相同所以value是list
countMap.get(count).add(map);
} else {
List<Map> listMap = new ArrayList<>();
listMap.add(map);
countMap.put(count, listMap);
}
}
List<Map> top10Data = new ArrayList();
if (top != null) {
top10Data = getTop10Data(set, countMap, 1);
} else {
top10Data = getTop10Data(set, countMap, 2);
}
List<String> notTop10List = new ArrayList<>();// 获取不在top10中的webid,用来查询标记为orther
for (Map map : matchList) {
String webIdStr = String.valueOf(map.get("webId"));
boolean exist = false;
for (Map map1 : top10Data) {
String webIdStr1 = String.valueOf(map1.get("webId"));
if (webIdStr1 != null && webIdStr != null && webIdStr1.equals(webIdStr)) {
exist = true;
}
if (!exist) {
notTop10List.add(webIdStr);
}
}
}
// 查询固定网站下的域名除了TOP10以外的others域名
if (matchList != null && matchList.size() > 10) {
Map others = trafficHttpStatisticDao.websiteDomainOthers(notTop10List, beginDate, endDate);
if (others != null && others.size() > 0) {
others.put("webId", "-1");
top10Data.add(others);
}
}
return top10Data;
}
/**
*
* 网站详情
*
* @param beginDate
* @param endDate
* @return
*/
public List<Map> getWebsiteDetails(Date beginDate, Date endDate, Integer domain[], Integer entranceId) {
List<Map> list = trafficHttpStatisticDao.getTrafficHttpDomain(beginDate, endDate, domain, entranceId);
return list;
}
/**
*
* 网站TOP10 默认一小时
*
* @param beginDate
* @param endDate
* @return
*/
public List<Map> getWebsiteTop10() {
Date startTime = getBeforeByHourTime(1);// 获取上一个小时
List<Map> list = getDomainByWebsiteList(startTime, new Date(), "top");
return list;
}
/**
* 获取网站列表
*
* @return
*/
@SuppressWarnings("unchecked")
public List<Map> getDomainByWebsiteList(Date beginDate, Date endDate, String top) {
Map<String, List<String>> websiteIdAndIdMap = new HashMap<>();// 存储websiteServiceId和id的对应关系,一个websiteServiceId有多个id
List<Map> websiteIdAndidList = trafficHttpStatisticDao.getDomainByWebsiteList(beginDate, endDate);// 获取website_service_id和id的对应关系,group
// by
// website_service_id,id
for (Map map : websiteIdAndidList) {
Object websiteServiceIdObj = map.get("websiteServiceId");
Object idObj = map.get("id");
if (websiteServiceIdObj != null && idObj != null) {
if (websiteIdAndIdMap.containsKey(String.valueOf(websiteServiceIdObj))) {
websiteIdAndIdMap.get(String.valueOf(websiteServiceIdObj)).add(String.valueOf(idObj));
} else {
List<String> list = new ArrayList<>();
list.add(String.valueOf(idObj));
websiteIdAndIdMap.put(String.valueOf(websiteServiceIdObj), list);
}
}
}
Set<Long> set = new HashSet<>();
Map<Long, List<Map>> countAndViewMap = new HashMap<>();// 存储count和map的对应关系,后面根据count过滤,获取top10的count
List<Map> webIdAndCountList = trafficHttpStatisticDao.getHttpStatisticNoLinkAndPkt(beginDate, endDate);// 获取最近一小时的webid和count的关系
List<Map> prevWebIdAndCountList = trafficHttpStatisticDao.getHttpStatisticNoLinkAndPkt(getBeforeByHourTime(2),
beginDate);// 获取最近一小时的webid和count的关系
for (String websiteServiceId : websiteIdAndIdMap.keySet()) {// 遍历上面获取的websiteServiceId和id的对应关系,拼接json
Map viewMap = new HashMap<>();
long count = 0l;// 记录当前websiteServiceId所有的count
long prevCount = 0l;// 记录当前websiteServiceId所有的count
List<String> idList = websiteIdAndIdMap.get(websiteServiceId);// 根据websiteServiceId获取对应的id
for (String id : idList) {
for (Map webIdAndCountMap : webIdAndCountList) {// 遍历webid和count
String webId = String.valueOf(webIdAndCountMap.get("webId"));
if (webId != null && webId.equals(id)) {// 如果webid和id相等则获取count数据并统计
String countStr = String.valueOf(webIdAndCountMap.get("byteCount"));
if (countStr != null) {
count += Long.parseLong(countStr);// 将count累加
}
}
}
for (Map webIdAndCountMap : prevWebIdAndCountList) {// 遍历webid和count
String webId = String.valueOf(webIdAndCountMap.get("webId"));
if (webId != null && webId.equals(id)) {// 如果webid和id相等则获取count数据并统计
String countStr = String.valueOf(webIdAndCountMap.get("byteCount"));
if (countStr != null) {
prevCount += Long.parseLong(countStr);// 将count累加
}
}
}
}
viewMap.put("websiteServiceId", websiteServiceId);
viewMap.put("count", count);
viewMap.put("pktNum", 0);
viewMap.put("byteLen", 0);
viewMap.put("preCount", prevCount);
if (countAndViewMap.containsKey(count)) {// 将每个count和对应的viewmap放到map中,count可能相同所以value是list
countAndViewMap.get(count).add(viewMap);
} else {
List<Map> listMap = new ArrayList<>();
listMap.add(viewMap);
countAndViewMap.put(count, listMap);
}
set.add(count);
}
List<Map> dataList = new ArrayList();
if (top != null) {
dataList = getTop10Data(set, countAndViewMap, 1);// 取top10
} else {
dataList = getTop10Data(set, countAndViewMap, 2);
}
return dataList;
}
/**
*
* 主题详情
*
* @param beginDate
* @param endDate
* @return
*/
public List<Map> getTopicDetails(Date beginDate, Date endDate) {
List<Map> topicAndDomainList = getTopicAndDomainList(beginDate, endDate, null);
return topicAndDomainList;
}
/**
*
* 主题TOP10 默认一小时
*
* @param beginDate
* @param endDate
* @return
*/
public List<Map> getTopicTop10() {
Date startTime = getBeforeByHourTime(1);// 获取上一个小时
List<Map> topicAndDomainList = getTopicAndDomainListNoLink(startTime, new Date(), "top");
return topicAndDomainList;
}
/**
* 主题网站分类,域名
*
**/
public List<Map> getTopicAndDomainListNoLink(Date beginDate, Date endDate, String top) {
Map<String, List<String>> topicIdAndIdMap = new HashMap<>();// 存储topicid和id的对应关系,一个topicid有多个id
List<Map> topicIdAndIdList = trafficHttpStatisticDao.getDomainByTopicList(beginDate, endDate);// 获取最近一个小时topicId和id的对应关系,group
for (Map map : topicIdAndIdList) {
Object topicIdObj = map.get("topicId");
Object idObj = map.get("id");
if (topicIdObj != null && idObj != null) {
if (topicIdAndIdMap.containsKey(String.valueOf(topicIdObj))) {
topicIdAndIdMap.get(String.valueOf(topicIdObj)).add(String.valueOf(idObj));
} else {
List<String> list = new ArrayList<>();
list.add(String.valueOf(idObj));
topicIdAndIdMap.put(String.valueOf(topicIdObj), list);
}
}
}
Set<Long> set = new HashSet<>();
Map<Long, List<Map>> countAndViewMap = new HashMap<>();// 存储count和map的对应关系,后面根据count过滤,获取top10的count
List<Map> webIdAndCountList = trafficHttpStatisticDao.getHttpStatisticNoLinkAndPkt(beginDate, endDate);// 获取最近一小时的webid和count的关系
for (String topicId : topicIdAndIdMap.keySet()) {// 遍历上面获取的topicid和id的对应关系,拼接json
Map viewMap = new HashMap<>();
List<Map> list = new ArrayList<>();
long count = 0l;// 记录当前topicid所有的count
// long linkNum = 0l;
// long packets = 0l;
List<String> idList = topicIdAndIdMap.get(topicId);// 根据topicid获取对应的id
for (String id : idList) {
for (Map webIdAndCountMap : webIdAndCountList) {// 遍历webid和count
String webId = String.valueOf(webIdAndCountMap.get("webId"));
if (webId != null && webId.equals(id)) {// 如果webid和id相等则获取count数据并统计
String countStr = String.valueOf(webIdAndCountMap.get("byteCount"));
// String linkNumStr = String.valueOf(webIdAndCountMap.get("linkNum"));
// String packetsStr = String.valueOf(webIdAndCountMap.get("pktCount"));
if (countStr != null) {
count += Long.parseLong(countStr);// 将count累加 转换单位小于0的不加
}
// if (linkNumStr != null) {
// linkNum += Long.parseLong(linkNumStr);// 将count累加
// }
// if (packetsStr != null) {
// packets += Long.parseLong(packetsStr);// 将count累加
// }
// webIdAndCountMap.remove("linkNum");
// webIdAndCountMap.remove("pktCount");
list.add(webIdAndCountMap);
}
}
}
Collections.sort(list, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
if (o1 == null && o2 != null) {
return 1;
}
if (o1 != null && o2 == null) {
return -1;
}
if (o1 == o2 && o1 == null) {
return 0;
}
Map m1 = (Map) o1;
Map m2 = (Map) o2;
Object ob1 = m1.get("byteCount");
Object ob2 = m2.get("byteCount");
Long b1 = Long.parseLong(ob1.toString());
Long b2 = Long.parseLong(ob2.toString());
return -(b1).compareTo(b2);
}
});
if (list.size() > 0) {
viewMap.put("count", count);
// viewMap.put("linkNum", linkNum);
// viewMap.put("packets", packets);
viewMap.put("domainData", list);
viewMap.put("topicId", topicId);
if (countAndViewMap.containsKey(count)) {// 将每个count和对应的viewmap放到map中,count可能相同所以value是list
countAndViewMap.get(count).add(viewMap);
} else {
List<Map> listMap = new ArrayList<>();
listMap.add(viewMap);
countAndViewMap.put(count, listMap);
}
set.add(count);
}
}
List<Map> dataList = new ArrayList();
if (top != null) {
dataList = getTop10Data(set, countAndViewMap, 1);
} else {
dataList = getTop10Data(set, countAndViewMap, 2);
}
return dataList;
}
public List<Map> getTopicAndDomainList(Date beginDate, Date endDate, String top) {
Map<String, List<String>> topicIdAndIdMap = new HashMap<>();// 存储topicid和id的对应关系,一个topicid有多个id
List<Map> topicIdAndIdList = trafficHttpStatisticDao.getDomainByTopicList(beginDate, endDate);// 获取最近一个小时topicId和id的对应关系,group
for (Map map : topicIdAndIdList) {
Object topicIdObj = map.get("topicId");
Object idObj = map.get("id");
if (topicIdObj != null && idObj != null) {
if (topicIdAndIdMap.containsKey(String.valueOf(topicIdObj))) {
topicIdAndIdMap.get(String.valueOf(topicIdObj)).add(String.valueOf(idObj));
} else {
List<String> list = new ArrayList<>();
list.add(String.valueOf(idObj));
topicIdAndIdMap.put(String.valueOf(topicIdObj), list);
}
}
}
Set<Long> set = new HashSet<>();
Map<Long, List<Map>> countAndViewMap = new HashMap<>();// 存储count和map的对应关系,后面根据count过滤,获取top10的count
List<Map> webIdAndCountList = trafficHttpStatisticDao.getTrafficHttpStatistic(beginDate, endDate);// 获取最近一小时的webid和count的关系
for (String topicId : topicIdAndIdMap.keySet()) {// 遍历上面获取的topicid和id的对应关系,拼接json
Map viewMap = new HashMap<>();
List<Map> list = new ArrayList<>();
long count = 0l;// 记录当前topicid所有的count
long linkNum = 0l;
long packets = 0l;
List<String> idList = topicIdAndIdMap.get(topicId);// 根据topicid获取对应的id
for (String id : idList) {
for (Map webIdAndCountMap : webIdAndCountList) {// 遍历webid和count
String webId = String.valueOf(webIdAndCountMap.get("webId"));
if (webId != null && webId.equals(id)) {// 如果webid和id相等则获取count数据并统计
String countStr = String.valueOf(webIdAndCountMap.get("byteCount"));
String linkNumStr = String.valueOf(webIdAndCountMap.get("linkNum"));
String packetsStr = String.valueOf(webIdAndCountMap.get("pktCount"));
if (countStr != null) {
count += Long.parseLong(countStr);// 将count累加
}
if (linkNumStr != null) {
linkNum += Long.parseLong(linkNumStr);// 将count累加
}
if (packetsStr != null) {
packets += Long.parseLong(packetsStr);// 将count累加
}
webIdAndCountMap.remove("linkNum");
webIdAndCountMap.remove("pktCount");
list.add(webIdAndCountMap);
}
}
}
if (list.size() > 0) {
viewMap.put("count", count);
viewMap.put("linkNum", linkNum);
viewMap.put("packets", packets);
viewMap.put("domainData", list);
viewMap.put("topicId", topicId);
if (countAndViewMap.containsKey(count)) {// 将每个count和对应的viewmap放到map中,count可能相同所以value是list
countAndViewMap.get(count).add(viewMap);
} else {
List<Map> listMap = new ArrayList<>();
listMap.add(viewMap);
countAndViewMap.put(count, listMap);
}
set.add(count);
}
}
List<Map> dataList = new ArrayList();
if (top != null) {
dataList = getTop10Data(set, countAndViewMap, 1);
} else {
dataList = getTop10Data(set, countAndViewMap, 2);
}
return dataList;
}
public String[] getFiledTypeByName(String fieldName) {
if (fieldName == null) {
return null;
}
String fieldType = null;
if ("addr_type".equals(fieldName)) {
fieldType = ntcTotalReportDao.getAddrType();
}
if ("trans_type".equals(fieldName)) {
fieldType = ntcTotalReportDao.getTransType();
}
if ("entrance_id".equals(fieldName)) {
fieldType = ntcTotalReportDao.getEntranceId();
}
return fieldType == null ? null : fieldType.split(",");
}
public Map<String, Map> getBandwidthTransEntrance(String beginDate, String endDate,String searchQuotaType) throws ParseException {
Map<String, Map> resultMap = new HashMap<String, Map>();
Map<String, ArrayList<TrafficTransStatistic>> listMap = new HashMap<String, ArrayList<TrafficTransStatistic>>();
List<TrafficTransStatistic> bandwidthListIPvx = new ArrayList<TrafficTransStatistic>();
List<TrafficTransStatistic> bandwidthListProtocol = new ArrayList<TrafficTransStatistic>();
bandwidthListIPvx = ntcTotalReportDao.getBandwidthTransIPVx(beginDate, endDate);
bandwidthListProtocol = ntcTotalReportDao.getBandwidthTransProtocol(beginDate, endDate);
Map<String, Map> trafficMap = new HashMap<String, Map>();
if ((!StringUtil.isEmpty(bandwidthListIPvx) && bandwidthListIPvx.size() > 0)
|| (!StringUtil.isEmpty(bandwidthListProtocol) && bandwidthListProtocol.size() > 0)) {
// 划分时间段
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startTime = sdf.parse(beginDate);
Date endTime = sdf.parse(endDate);
List<Date> dateRangeList = new ArrayList<Date>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(startTime);
while (calendar.getTime().compareTo(endTime) < 0) {
dateRangeList.add(calendar.getTime());
calendar.add(Calendar.MINUTE, Constants.TREND_TIME_INTERVAL);
}
String[] addrTypes = getFiledTypeByName("addr_type");
String[] transTypes = getFiledTypeByName("trans_type");
String[] entranceIds = getFiledTypeByName("entrance_id");
if (bandwidthListIPvx != null && bandwidthListIPvx.size() > 0 && bandwidthListProtocol != null
&& bandwidthListProtocol.size() > 0 && addrTypes != null && addrTypes.length > 0
&& transTypes != null && transTypes.length > 0 && entranceIds != null && entranceIds.length > 0) {
// 按区域和类型构建Map
for (String entranceId : entranceIds) {
for (String addrType : addrTypes) {
listMap.put("ipv" + addrType + "Type" + entranceId, new ArrayList<TrafficTransStatistic>());
}
}
for (String entranceId : entranceIds) {
for (String transType : transTypes) {
listMap.put("trans" + transType + "Type" + entranceId, new ArrayList<TrafficTransStatistic>());
}
}
// 按区域和类型提取数据到列表中
for (TrafficTransStatistic tts : bandwidthListIPvx) {
String addrType = tts.getAddrType();
Integer entranceId = tts.getEntranceId();
Integer transType = tts.getTransType();
String key = "ipv" + addrType + "Type" + entranceId;
listMap.get(key).add(tts);
}
for (TrafficTransStatistic tts : bandwidthListProtocol) {
String addrType = tts.getAddrType();
Integer entranceId = tts.getEntranceId();
Integer transType = tts.getTransType();
String key = "trans" + transType + "Type" + entranceId;
listMap.get(key).add(tts);
}
Set<Entry<String, ArrayList<TrafficTransStatistic>>> entrySet = listMap.entrySet();
for (Entry<String, ArrayList<TrafficTransStatistic>> entry : entrySet) {
String key = entry.getKey();
String entranceId = key.substring(key.length() - 1);
ArrayList<TrafficTransStatistic> value = entry.getValue();
resultMap.put(key, getNewData(dateRangeList,value,searchQuotaType));
}
}
}
return resultMap;
}
private Map getNewData(List<Date> dateRangeList,List<TrafficTransStatistic> bandwidthList,String searchQuotaType) {
Map restMap = new HashMap();
List<List> restList = new ArrayList<List>();
int index = 0;
Long sum = 0l;
for (int i = 0; i < dateRangeList.size(); i++) {
Date date = dateRangeList.get(i);
List countList = new ArrayList();
countList.add(date.getTime());
long num = 0l;
for (int j = index; j < bandwidthList.size(); j++) {
TrafficTransStatistic info = bandwidthList.get(j);
if (info.getStatTime() != null) {
if (info.getStatTime().compareTo(date) >= 0 && (i + 1 < dateRangeList.size()?info.getStatTime().compareTo(dateRangeList.get(i + 1)) < 0:true)) {
if ("pps".equalsIgnoreCase(searchQuotaType)) {
num = Long.parseLong(info.getPps().substring(0, info.getPps().lastIndexOf("."))) + num;
}else if ("linkNumber".equalsIgnoreCase(searchQuotaType)) {
num = Long.parseLong(info.getPps().substring(0, info.getPps().lastIndexOf("."))) + num;
}else {
num = Long.parseLong(info.getGbps().substring(0, info.getGbps().lastIndexOf(".")))+ num;
}
} else {
index = j;
break;
}
}
}
countList.add(num);
sum+=num;
restList.add(countList);
}
restMap.put("sum", sum);
restMap.put("result", restList);
return restMap;
}
/**
*
* @param beginDate
* @param endDate
* @param domain
* @param entranceId
* @return
*/
/*
* public List<HashMap> getDomainTrans(String beginDate, String endDate, Integer
* domain, Integer entranceId) { List<HashMap> listMap = new
* ArrayList<HashMap>(); HashMap resulMap = new HashMap();
* List<TrafficHttpFocusStatistic> domainList = new
* ArrayList<TrafficHttpFocusStatistic>(); domainList =
* trafficHttpStatisticDao.getDomainTrans(entranceId, beginDate, endDate,
* domain); List timeList = new ArrayList(); List countList = new ArrayList();
* if (domainList != null && domainList.size() > 0) { Map<String, Comparable> m
* = new HashMap<String, Comparable>(); int inter = 1000 * 60 * 30;// 间隔时间为30分钟
* // 开始时间,结束时间 时间戳 Long b = dateToStamp(beginDate); Long e =
* dateToStamp(endDate); int num = 0; Long pointTime = b; while (pointTime < e)
* { Map rm = new HashMap(); Long sumL = 0l; if (pointTime >= e) { break; // 停止
* } for (TrafficHttpFocusStatistic tt : domainList) { // 实际时间 String time =
* tt.getTime(); Long t = dateToStamp(time); if (t >= pointTime && t < pointTime
* + inter) { // 范围之内分到此pointTime组 sumL = sumL + tt.getCount(); } } //
* 在结束时间只有当值大于0时才记录数据防止折线降为0引起误会 if (pointTime >= e - inter && sumL > 0) {
* countList.add(sumL); timeList.add(stampToDate(pointTime)); } if (pointTime <
* e - inter) { timeList.add(stampToDate(pointTime)); countList.add(sumL); } num
* = num + 1; pointTime = b + inter * num; } resulMap.put("count", countList);
* resulMap.put("statTime", timeList); listMap.add(resulMap); } return listMap;
* }
*/
/**
* 优化后的网站详情域名趋势查询
*
* @param beginDate
* @param endDate
* @param domain
* @param entranceId
* @return
*/
public List<HashMap> getDomainTrans2(String begin, String end, Integer domain, Integer entranceId) {
List<TrafficHttpFocusStatistic> domainList = new ArrayList<TrafficHttpFocusStatistic>();
domainList = trafficHttpStatisticDao.getDomainTrans(entranceId, begin, end, domain);
List<HashMap> listMap = new ArrayList<HashMap>();
if(!StringUtil.isEmpty(domainList)){
Date beginDate = DateUtils.parseDate(begin);
Date endDate = DateUtils.parseDate(end);
List<Date> dateRangeList = new ArrayList<Date>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(beginDate);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (calendar.getTime().compareTo(endDate) < 0) {
dateRangeList.add(calendar.getTime());
calendar.add(Calendar.MINUTE, Constants.TREND_TIME_INTERVAL);
}
// 存放每个时间点的总数
Map<String, List<Long>> ipCountListMap = new HashMap<String, List<Long>>();
int index = 0;
List resultList = new ArrayList();
Long total = 0L;
for (int i = 0; i < dateRangeList.size(); i++) {
// 存放一个时间点中总数
List sumList = new ArrayList();
Date date = dateRangeList.get(i);
Long num = 0L;
for (int j = index; j < domainList.size(); j++) {
TrafficHttpFocusStatistic ipInfo = domainList.get(j);
if (ipInfo.getStatTime() != null) {
if (ipInfo.getStatTime().compareTo(date) >= 0 && (i + 1 < dateRangeList.size()?ipInfo.getStatTime().compareTo(dateRangeList.get(i + 1)) < 0:true)) {
num = num + ipInfo.getCount();
} else {
index = j;
break;
}
}
}
sumList.add(date.getTime());
sumList.add(num);
resultList.add(sumList);
total+=num;
}
// 整合 count time
HashMap ipTrafficMap = new HashMap();
ipTrafficMap.put("result", resultList);
ipTrafficMap.put("sum", total);
listMap.add(ipTrafficMap);
}
return listMap;
}
/**
* 获取活跃Port top10 的趋势图
*
* @throws ParseException
*/
public List<Map> findTrafficPortActive(String beginDate, String endDate, Integer[] portArray)
throws ParseException {
List<Map> listMap = new ArrayList<Map>();
StringBuilder portStr = new StringBuilder();
List<LinkedHashMap> portListTop10 = null;
if (portArray != null && portArray.length > 0) {// 如果有传人参数,获取传人参数
for (int pi = 0; pi < portArray.length; pi++) {
portStr.append("'" + portArray[pi] + "',");
}
} else {// 否则获取TOP10
portListTop10 = trafficPortActiveStatisticDao.findTrafficPortActiveTopN(beginDate, endDate);
for (LinkedHashMap map : portListTop10) {
portStr.append("'" + map.get("port") + "',");
}
}
if (!StringUtil.isEmpty(portStr) && portStr.indexOf(",") > 0) {
portStr.deleteCharAt(portStr.lastIndexOf(","));
}
Date beginDate1 = DateUtils.strToDate(beginDate, "yyyy-MM-dd HH:mm:ss");
Date endDate1 = DateUtils.strToDate(endDate, "yyyy-MM-dd HH:mm:ss");
// if (portListTop10 != null && portListTop10.size() > 0) {
// StringBuilder portStr = new StringBuilder();
if (!StringUtil.isEmpty(portStr)) {
// 如果所有IP在最后一个时间点的count都为0则移除最后一个点
// 开始划分时间段,间隔5分钟
List<Date> dateRangeList = new ArrayList<Date>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(beginDate1);
while (calendar.getTime().compareTo(endDate1) < 0) {
dateRangeList.add(calendar.getTime());
calendar.add(Calendar.MINUTE, Constants.TREND_TIME_INTERVAL);
}
ArrayList<TrafficPortActiveStatistic> portInfoList = trafficPortActiveStatisticDao
.findTrafficPortActive(beginDate, endDate, portStr.toString());
// 存放每个IP每个时间点的总数
Map<String, List<Long>> portCountListMap = new HashMap<String, List<Long>>();
int index = 0;
for (int i = 0; i < dateRangeList.size(); i++) {
// 存放一个时间点中每个IP的总数
Map<String, Long> portCountMap = new HashMap<String, Long>();
Date date = dateRangeList.get(i);
for (int j = index; j < portInfoList.size(); j++) {
TrafficPortActiveStatistic portInfo = portInfoList.get(j);
if (portInfo.getStatTime() != null) {
if (portInfo.getStatTime().compareTo(date) >= 0 && (i + 1 < dateRangeList.size()?portInfo.getStatTime().compareTo(dateRangeList.get(i + 1)) < 0:true)) {
Long num = portInfo.getSum();
if (portCountMap.containsKey(portInfo.getPort())) {
num = num + portCountMap.get(portInfo.getPort());
}
portCountMap.put(portInfo.getPort().toString(), num);
} else {
index = j;
break;
}
}
}
if (portArray != null && portArray.length > 0) {// 如果有传人参数,获取传人参数
for (int m = 0; m < portArray.length; m++) {
String port = portArray[m].toString();
List sumList = new ArrayList();
sumList.add(date.getTime());
Long sum = 0l;
if (portCountMap.containsKey(port)) {
sum = portCountMap.get(port);
}
sumList.add(sum);
if (portCountListMap.containsKey(port)) {
List list = portCountListMap.get(port);
list.add(sumList);
} else {
List list = new ArrayList();
list.add(sumList);
portCountListMap.put(port, list);
}
}
} else if (portListTop10 != null) {
for (LinkedHashMap map : portListTop10) {
String port = map.get("port").toString();
List sumList = new ArrayList();
sumList.add(date.getTime());
Long sum = 0l;
if (portCountMap.containsKey(port)) {
sum = portCountMap.get(port);
}
sumList.add(sum);
if (portCountListMap.containsKey(port)) {
List list = portCountListMap.get(port);
list.add(sumList);
} else {
List list = new ArrayList();
list.add(sumList);
portCountListMap.put(port, list);
}
}
}
}
// 整合port sum time
Iterator iterator = portCountListMap.keySet().iterator();
while (iterator.hasNext()) {
String port = iterator.next() + "";
Map trafficPortActiveMap = new HashMap();
Long total = 0L;
for (Object obj : portCountListMap.get(port)) {
List<Long> list = (List) obj;
total+=list.get(1);
}
trafficPortActiveMap.put("port", port);
trafficPortActiveMap.put("result", portCountListMap.get(port));
trafficPortActiveMap.put("sum", total);
listMap.add(trafficPortActiveMap);
}
}
return listMap;
}
/**
* 根据指标(drop,loop,New Link,Close Link,Pass,Live Link)统计各业务的趋势
* @throws ParseException
*/
public Map trendTotalReport(NtcConnNumReport ntcConnNumReport){
Map restMap = new HashMap();
List<NtcConnNumReport> list = ntcTotalReportDao.trendTotalReport(ntcConnNumReport);
if (list!=null && list.size()>0) {
//开始划分时间段,间隔5分钟
Date beginDate;
Date endDate;
try {
beginDate = DateUtils.strToDate(ntcConnNumReport.getSearchReportStartTime(), "yyyy-MM-dd HH:mm:ss");
endDate = DateUtils.strToDate(ntcConnNumReport.getSearchReportEndTime(), "yyyy-MM-dd HH:mm:ss");
} catch (ParseException e) {
// TODO Auto-generated catch block
throw new RestServiceException("searchReportStartTime或searchReportEndTime参数格式错误", RestBusinessCode.param_formate_error.getValue());
}
List<Date> dateRangeList = new ArrayList<Date>();
List<String> strDateRangeList = new ArrayList<String>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(beginDate);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (calendar.getTime().compareTo(endDate)<0) {
dateRangeList.add(calendar.getTime());
calendar.add(Calendar.MINUTE, Constants.TREND_TIME_INTERVAL);
}
int index = 0;
List sumList = new ArrayList();
Long totalNum = 0L;
for (int i = 0; i < dateRangeList.size(); i++) {
//存放一个时间点中每个IP的总数
List tempList = new ArrayList();
Map<String, Long> ipCountMap = new HashMap<String, Long>();
Date date = dateRangeList.get(i);
Long sum = 0l;
for (int j = index; j < list.size(); j++) {
NtcConnNumReport info = list.get(j);
if (info.getReportTime()!=null){
if(info.getReportTime().compareTo(date)>=0&&(i+1<dateRangeList.size()?info.getReportTime().compareTo(dateRangeList.get(i+1))<0:true)) {
sum = sum+info.getNum();
}else{
index = j;
break;
}
}
}
totalNum+=sum;
tempList.add(date.getTime());
tempList.add(sum);
sumList.add(tempList);
}
restMap.put("sum", totalNum);
restMap.put("result", sumList);
}
return restMap;
}
public Map getAppTrend(TrafficAppFocusStatistic entity) {
List<TrafficAppFocusStatistic> appFocusList = new ArrayList<TrafficAppFocusStatistic>();
appFocusList = trafficAppStatisticDao.getAppTrend(entity);
Map resultMap = new HashMap();
if(!StringUtil.isEmpty(appFocusList)){
Date beginDate = DateUtils.parseDate(entity.getSearchStartTime());
Date endDate = DateUtils.parseDate(entity.getSearchEndTime());
List<Date> dateRangeList = new ArrayList<Date>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(beginDate);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (calendar.getTime().compareTo(endDate) < 0) {
dateRangeList.add(calendar.getTime());
calendar.add(Calendar.MINUTE, 1);
}
// 存放每个时间点的总数
Map<String, List<Long>> ipCountListMap = new HashMap<String, List<Long>>();
int index = 0;
List resultSipList = new ArrayList();
List resultDipList = new ArrayList();
Long sipTotal = 0L;
Long dipTotal = 0L;
for (int i = 0; i < dateRangeList.size(); i++) {
// 存放一个时间点中总数
List sipList = new ArrayList();
List dipList = new ArrayList();
Date date = dateRangeList.get(i);
Long sipNum = 0L;
Long dipNum = 0L;
for (int j = index; j < appFocusList.size(); j++) {
TrafficAppFocusStatistic info = appFocusList.get(j);
if (info.getTime() != null) {
if (info.getTime().compareTo(date) >= 0 && (i + 1 < dateRangeList.size()?info.getTime().compareTo(dateRangeList.get(i + 1)) < 0:true)) {
sipNum = sipNum + info.getSipNum();
dipNum = dipNum + info.getDipNum();
} else {
index = j;
break;
}
}
}
sipList.add(date.getTime());
sipList.add(sipNum);
resultSipList.add(sipList);
dipList.add(date.getTime());
dipList.add(dipNum);
resultDipList.add(dipList);
sipTotal+=sipNum;
dipTotal+=dipNum;
}
resultMap.put("sipResult", resultSipList);
resultMap.put("dipResult", resultDipList);
resultMap.put("sipSum", sipTotal);
resultMap.put("dipSum", dipTotal);
}
return resultMap;
}
public List<AppConnRecordStatistic> appConnRecordTop100(AppConnRecordStatistic entity) {
List<AppConnRecordStatistic> list = new ArrayList<AppConnRecordStatistic>();
list = trafficAppStatisticDao.appConnRecordTop100(entity);
return list;
}
}