新增首页图表接口
This commit is contained in:
+4
-18
@@ -27,27 +27,13 @@ public class ReportController {
|
||||
private ReportService reportService;
|
||||
|
||||
/**
|
||||
* 数据一览:
|
||||
* 在线用户数 查询token有效的用户ID数
|
||||
* 在线Client数 查询license表,状态为在线的数量
|
||||
* 今日流量 上行/下行/总计
|
||||
* 历史流量 上行/下行/总计
|
||||
*
|
||||
* 1、点击在线用户数:下方展示在线的用户列表,带分页
|
||||
* 2、点击在线client数:下方展示在线的license列表,带分页
|
||||
* 3、点击今日流量:下方展示今日的流量折线图(小时)。 筛选项:全部/用户列表
|
||||
* 4、点击历史流量:下方展示历史流量折线图。筛选项:日/月 日期选择:日(展示最近30天,最多跨30日),月(展示最近12个月,最多跨12个月)
|
||||
* 首页数据一览
|
||||
* @return
|
||||
*/
|
||||
@Get
|
||||
@Mapping("/data-view")
|
||||
public ReportDataViewRes dataView() {
|
||||
return new ReportDataViewRes()
|
||||
.setUserOnlineNumber(2).setEnableUserNumber(3).setUserNumber(5)
|
||||
.setLicenseNumber(3).setEnableLicenseNumber(6).setLicenseNumber(6)
|
||||
.setServerPortOnlineNumber(3).setEnableServerPortNumber(5).setServerPortNumber(6)
|
||||
.setTotalUpstreamFlow("23K").setTotalDownwardFlow("47M")
|
||||
;
|
||||
@Mapping("/home/data-view")
|
||||
public HomeDataView homeDataView() {
|
||||
return reportService.homeDataView();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+208
@@ -0,0 +1,208 @@
|
||||
package fun.asgc.neutrino.proxy.server.controller.res.report;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author: aoshiguchen
|
||||
* @date: 2023/3/26
|
||||
*/
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public class HomeDataView {
|
||||
|
||||
/**
|
||||
* licenses数据
|
||||
*/
|
||||
private License license;
|
||||
|
||||
/**
|
||||
* 端口映射
|
||||
*/
|
||||
private PortMapping portMapping;
|
||||
|
||||
/**
|
||||
* 今日流量
|
||||
*/
|
||||
private TodayFlow todayFlow;
|
||||
|
||||
/**
|
||||
* 总流量
|
||||
*/
|
||||
private TotalFlow totalFlow;
|
||||
|
||||
/**
|
||||
* 最近7日流量
|
||||
*/
|
||||
private Last7dFlow last7dFlow;
|
||||
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public static class License {
|
||||
/**
|
||||
* 总数
|
||||
*/
|
||||
private Integer totalCount;
|
||||
/**
|
||||
* 在线数
|
||||
*/
|
||||
private Integer onlineCount;
|
||||
/**
|
||||
* 离线数
|
||||
*/
|
||||
private Integer offlineCount;
|
||||
}
|
||||
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public static class PortMapping {
|
||||
/**
|
||||
* 总数
|
||||
*/
|
||||
private Integer totalCount;
|
||||
/**
|
||||
* 在线数
|
||||
*/
|
||||
private Integer onlineCount;
|
||||
/**
|
||||
* 离线数
|
||||
*/
|
||||
private Integer offlineCount;
|
||||
}
|
||||
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public static class TodayFlow {
|
||||
/**
|
||||
* 上行流量字节数
|
||||
*/
|
||||
private Long upFlowBytes;
|
||||
/**
|
||||
* 下行流量字节数
|
||||
*/
|
||||
private Long downFlowBytes;
|
||||
/**
|
||||
* 总流量字节数
|
||||
*/
|
||||
private Long totalFlowBytes;
|
||||
/**
|
||||
* 上行流量描述
|
||||
*/
|
||||
private String upFlowDesc;
|
||||
/**
|
||||
* 下行流量描述
|
||||
*/
|
||||
private String downFlowDesc;
|
||||
/**
|
||||
* 总流量描述
|
||||
*/
|
||||
private String totalFlowDesc;
|
||||
}
|
||||
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public static class TotalFlow {
|
||||
/**
|
||||
* 上行流量字节数
|
||||
*/
|
||||
private Long upFlowBytes;
|
||||
/**
|
||||
* 下行流量字节数
|
||||
*/
|
||||
private Long downFlowBytes;
|
||||
/**
|
||||
* 总流量字节数
|
||||
*/
|
||||
private Long totalFlowBytes;
|
||||
/**
|
||||
* 上行流量描述
|
||||
*/
|
||||
private String upFlowDesc;
|
||||
/**
|
||||
* 下行流量描述
|
||||
*/
|
||||
private String downFlowDesc;
|
||||
/**
|
||||
* 总流量描述
|
||||
*/
|
||||
private String totalFlowDesc;
|
||||
}
|
||||
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public static class Last7dFlow {
|
||||
/**
|
||||
* 最近7日流量数据
|
||||
*/
|
||||
private List<SingleDayFlow> dataList;
|
||||
/**
|
||||
* x轴日期
|
||||
*/
|
||||
private List<String> xDate;
|
||||
/**
|
||||
* 图例(上行流量、下行流量、总流量)
|
||||
*/
|
||||
private List<String> legendData;
|
||||
/**
|
||||
* 折线列表
|
||||
*/
|
||||
private List<Series> seriesList;
|
||||
}
|
||||
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public static class SingleDayFlow {
|
||||
/**
|
||||
* 日期字符串
|
||||
*/
|
||||
private String dateStr;
|
||||
/**
|
||||
* 日期
|
||||
*/
|
||||
private Date date;
|
||||
/**
|
||||
* 上行流量字节数
|
||||
*/
|
||||
private Long upFlowBytes;
|
||||
/**
|
||||
* 下行流量字节数
|
||||
*/
|
||||
private Long downFlowBytes;
|
||||
/**
|
||||
* 总流量字节数
|
||||
*/
|
||||
private Long totalFlowBytes;
|
||||
/**
|
||||
* 上行流量描述
|
||||
*/
|
||||
private String upFlowDesc;
|
||||
/**
|
||||
* 下行流量描述
|
||||
*/
|
||||
private String downFlowDesc;
|
||||
/**
|
||||
* 总流量描述
|
||||
*/
|
||||
private String totalFlowDesc;
|
||||
}
|
||||
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public static class Series {
|
||||
/**
|
||||
* 此处目前固定为:line
|
||||
*/
|
||||
private String seriesType;
|
||||
/**
|
||||
* 名称:上行流量、下行流量、总流量
|
||||
*/
|
||||
private String seriesName;
|
||||
/**
|
||||
* y值序列
|
||||
*/
|
||||
private List<Long> seriesData;
|
||||
}
|
||||
}
|
||||
-57
@@ -1,57 +0,0 @@
|
||||
package fun.asgc.neutrino.proxy.server.controller.res.report;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* @author: aoshiguchen
|
||||
* @date: 2022/9/12
|
||||
*/
|
||||
@Accessors(chain = true)
|
||||
@Data
|
||||
public class ReportDataViewRes {
|
||||
/**
|
||||
* 在线用户数
|
||||
*/
|
||||
private Integer userOnlineNumber;
|
||||
/**
|
||||
* 启用用户数
|
||||
*/
|
||||
private Integer enableUserNumber;
|
||||
/**
|
||||
* 用户总数
|
||||
*/
|
||||
private Integer userNumber;
|
||||
/**
|
||||
* 在线license数
|
||||
*/
|
||||
private Integer licenseOnlineNumber;
|
||||
/**
|
||||
* 启用license数
|
||||
*/
|
||||
private Integer enableLicenseNumber;
|
||||
/**
|
||||
* license总数
|
||||
*/
|
||||
private Integer licenseNumber;
|
||||
/**
|
||||
* 服务端口在线数
|
||||
*/
|
||||
private Integer serverPortOnlineNumber;
|
||||
/**
|
||||
* 启用服务端口数
|
||||
*/
|
||||
private Integer enableServerPortNumber;
|
||||
/**
|
||||
* 总的服务端口数
|
||||
*/
|
||||
private Integer serverPortNumber;
|
||||
/**
|
||||
* 累计上行流量
|
||||
*/
|
||||
private String totalUpstreamFlow;
|
||||
/**
|
||||
* 累计下行流量
|
||||
*/
|
||||
private String totalDownwardFlow;
|
||||
}
|
||||
+1
-1
@@ -33,7 +33,7 @@ import java.util.List;
|
||||
public interface FlowReportDayMapper extends BaseMapper<FlowReportDayDO> {
|
||||
default void clean(Date date) {
|
||||
this.delete(new LambdaQueryWrapper<FlowReportDayDO>()
|
||||
.lt(FlowReportDayDO::getCreateTime, date)
|
||||
.lt(FlowReportDayDO::getDate, date)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@ import java.util.List;
|
||||
public interface FlowReportHourMapper extends BaseMapper<FlowReportHourDO> {
|
||||
default void clean(Date date) {
|
||||
this.delete(new LambdaQueryWrapper<FlowReportHourDO>()
|
||||
.lt(FlowReportHourDO::getCreateTime, date)
|
||||
.lt(FlowReportHourDO::getDate, date)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ import java.util.Set;
|
||||
public interface FlowReportMinuteMapper extends BaseMapper<FlowReportMinuteDO> {
|
||||
default void clean(Date date) {
|
||||
this.delete(new LambdaQueryWrapper<FlowReportMinuteDO>()
|
||||
.lt(FlowReportMinuteDO::getCreateTime, date)
|
||||
.lt(FlowReportMinuteDO::getDate, date)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+29
-4
@@ -1,9 +1,8 @@
|
||||
package fun.asgc.neutrino.proxy.server.dal;
|
||||
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.LicenseFlowMonthReportRes;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.LicenseFlowReportRes;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.UserFlowMonthReportRes;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.UserFlowReportRes;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.*;
|
||||
import fun.asgc.neutrino.proxy.server.service.bo.FlowBO;
|
||||
import fun.asgc.neutrino.proxy.server.service.bo.SingleDayFlowBO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
@@ -41,4 +40,30 @@ public interface ReportMapper {
|
||||
* @return
|
||||
*/
|
||||
List<LicenseFlowMonthReportRes> licenseFLowMonthReportList(@Param("userId") Integer userId, @Param("licenseId") Integer licenseId, @Param("curMonthBeginDate") Date curMonthBeginDate, @Param("curDayBeginDate") Date curDayBeginDate, @Param("curDate") Date curDate);
|
||||
|
||||
/**
|
||||
* 首页 - 今日流量
|
||||
* @param curDayBeginDate
|
||||
* @param curDate
|
||||
* @return
|
||||
*/
|
||||
FlowBO homeTodayFlow(@Param("curDayBeginDate") Date curDayBeginDate, @Param("curDate") Date curDate);
|
||||
|
||||
/**
|
||||
* 首页 - 总流量
|
||||
* @param curMonthBeginDate
|
||||
* @param curDayBeginDate
|
||||
* @param curDate
|
||||
* @return
|
||||
*/
|
||||
FlowBO homeTotalFlow(@Param("curMonthBeginDate") Date curMonthBeginDate, @Param("curDayBeginDate") Date curDayBeginDate, @Param("curDate") Date curDate);
|
||||
|
||||
/**
|
||||
* 首页最近7日流量
|
||||
* @param beginDate
|
||||
* @param curDayBeginDate
|
||||
* @param curDate
|
||||
* @return
|
||||
*/
|
||||
List<SingleDayFlowBO> homeLast7dFlowList(@Param("beginDate") Date beginDate, @Param("curDayBeginDate") Date curDayBeginDate, @Param("curDate") Date curDate);
|
||||
}
|
||||
|
||||
+200
-6
@@ -1,21 +1,27 @@
|
||||
package fun.asgc.neutrino.proxy.server.service;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.google.common.collect.Lists;
|
||||
import fun.asgc.neutrino.proxy.core.util.DateUtil;
|
||||
import fun.asgc.neutrino.proxy.server.base.db.DbConfig;
|
||||
import fun.asgc.neutrino.proxy.server.base.page.PageInfo;
|
||||
import fun.asgc.neutrino.proxy.server.base.page.PageQuery;
|
||||
import fun.asgc.neutrino.proxy.server.constant.OnlineStatusEnum;
|
||||
import fun.asgc.neutrino.proxy.server.controller.req.report.LicenseFlowMonthReportReq;
|
||||
import fun.asgc.neutrino.proxy.server.controller.req.report.LicenseFlowReportReq;
|
||||
import fun.asgc.neutrino.proxy.server.controller.req.report.UserFlowMonthReportReq;
|
||||
import fun.asgc.neutrino.proxy.server.controller.req.report.UserFlowReportReq;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.LicenseFlowMonthReportRes;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.LicenseFlowReportRes;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.UserFlowMonthReportRes;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.UserFlowReportRes;
|
||||
import fun.asgc.neutrino.proxy.server.controller.res.report.*;
|
||||
import fun.asgc.neutrino.proxy.server.dal.LicenseMapper;
|
||||
import fun.asgc.neutrino.proxy.server.dal.PortMappingMapper;
|
||||
import fun.asgc.neutrino.proxy.server.dal.ReportMapper;
|
||||
import fun.asgc.neutrino.proxy.server.dal.entity.LicenseDO;
|
||||
import fun.asgc.neutrino.proxy.server.dal.entity.PortMappingDO;
|
||||
import fun.asgc.neutrino.proxy.server.service.bo.FlowBO;
|
||||
import fun.asgc.neutrino.proxy.server.service.bo.SingleDayFlowBO;
|
||||
import fun.asgc.neutrino.proxy.server.util.FormatUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import ma.glasnost.orika.MapperFacade;
|
||||
@@ -23,8 +29,8 @@ import org.apache.ibatis.solon.annotation.Db;
|
||||
import org.noear.solon.annotation.Component;
|
||||
import org.noear.solon.annotation.Inject;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author: aoshiguchen
|
||||
@@ -37,9 +43,65 @@ public class ReportService {
|
||||
private MapperFacade mapperFacade;
|
||||
@Db
|
||||
private ReportMapper reportMapper;
|
||||
@Db
|
||||
private LicenseMapper licenseMapper;
|
||||
@Db
|
||||
private PortMappingMapper portMappingMapper;
|
||||
@Inject
|
||||
private DbConfig dbConfig;
|
||||
|
||||
/**
|
||||
* 首页图表
|
||||
* @return
|
||||
*/
|
||||
public HomeDataView homeDataView() {
|
||||
HomeDataView homeDataView = new HomeDataView();
|
||||
homeDataView.setLicense(new HomeDataView.License().setTotalCount(0).setOnlineCount(0));
|
||||
homeDataView.setPortMapping(new HomeDataView.PortMapping().setTotalCount(0).setOnlineCount(0));
|
||||
homeDataView.setTodayFlow(new HomeDataView.TodayFlow().setUpFlowBytes(0L).setDownFlowBytes(0L));
|
||||
homeDataView.setTotalFlow(new HomeDataView.TotalFlow().setUpFlowBytes(0L).setDownFlowBytes(0L));
|
||||
|
||||
// 查询license列表
|
||||
List<LicenseDO> licenseDOList = licenseMapper.listAll();
|
||||
if (CollectionUtil.isNotEmpty(licenseDOList)) {
|
||||
homeDataView.getLicense().setTotalCount(licenseDOList.size());
|
||||
homeDataView.getLicense().setOnlineCount((int)licenseDOList.stream().filter(e -> OnlineStatusEnum.ONLINE.getStatus().equals(e.getIsOnline())).count());
|
||||
}
|
||||
// 查询端口映射列表
|
||||
List<PortMappingDO> portMappingDOList = portMappingMapper.selectList(new LambdaQueryWrapper<>());
|
||||
if (CollectionUtil.isNotEmpty(portMappingDOList)) {
|
||||
homeDataView.getPortMapping().setTotalCount(portMappingDOList.size());
|
||||
homeDataView.getPortMapping().setOnlineCount((int)portMappingDOList.stream().filter(e -> OnlineStatusEnum.ONLINE.getStatus().equals(e.getIsOnline())).count());
|
||||
}
|
||||
// 今日流量
|
||||
Date now = new Date();
|
||||
FlowBO todayFlow = reportMapper.homeTodayFlow(DateUtil.getDayBegin(now), now);
|
||||
homeDataView.setTodayFlow(mapperFacade.map(todayFlow, HomeDataView.TodayFlow.class));
|
||||
|
||||
// 总流量
|
||||
FlowBO totalFlow = reportMapper.homeTotalFlow(DateUtil.getMonthBegin(now), DateUtil.getDayBegin(now), now);
|
||||
homeDataView.setTotalFlow(mapperFacade.map(totalFlow, HomeDataView.TotalFlow.class));
|
||||
|
||||
// 最近7日流量
|
||||
List<SingleDayFlowBO> last7dFlowList = reportMapper.homeLast7dFlowList(DateUtil.getDayBegin(DateUtil.addDate(now, Calendar.DATE, -6)), DateUtil.getDayBegin(now), now);
|
||||
homeDataView.setLast7dFlow(new HomeDataView.Last7dFlow());
|
||||
homeDataView.getLast7dFlow().setDataList(mapperFacade.mapAsList(last7dFlowList, HomeDataView.SingleDayFlow.class));
|
||||
// 查询统计数据
|
||||
// homeDataView.setLast7dFlow(new HomeDataView.Last7dFlow().setDataList(Lists.newArrayList(
|
||||
// new HomeDataView.SingleDayFlow().setDate(DateUtil.parse("2023-03-20", "yyyy-MM-dd")).setUpFlowBytes(1000L).setDownFlowBytes(20000L),
|
||||
// new HomeDataView.SingleDayFlow().setDate(DateUtil.parse("2023-03-21", "yyyy-MM-dd")).setUpFlowBytes(1100L).setDownFlowBytes(21000L),
|
||||
// new HomeDataView.SingleDayFlow().setDate(DateUtil.parse("2023-03-22", "yyyy-MM-dd")).setUpFlowBytes(1200L).setDownFlowBytes(22000L),
|
||||
// new HomeDataView.SingleDayFlow().setDate(DateUtil.parse("2023-03-23", "yyyy-MM-dd")).setUpFlowBytes(1300L).setDownFlowBytes(23000L),
|
||||
// new HomeDataView.SingleDayFlow().setDate(DateUtil.parse("2023-03-24", "yyyy-MM-dd")).setUpFlowBytes(1400L).setDownFlowBytes(24000L),
|
||||
// new HomeDataView.SingleDayFlow().setDate(DateUtil.parse("2023-03-25", "yyyy-MM-dd")).setUpFlowBytes(1500L).setDownFlowBytes(25000L),
|
||||
// new HomeDataView.SingleDayFlow().setDate(DateUtil.parse("2023-03-26", "yyyy-MM-dd")).setUpFlowBytes(1600L).setDownFlowBytes(26000L)
|
||||
// )));
|
||||
|
||||
// 数据处理
|
||||
fillHomeDataView(homeDataView, now);
|
||||
return homeDataView;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户流量报表分页
|
||||
* @param pageQuery
|
||||
@@ -163,4 +225,136 @@ public class ReportService {
|
||||
item.setTotalFlowDesc(FormatUtil.getSizeDescByByteCount(totalFlowBytes));
|
||||
}
|
||||
}
|
||||
|
||||
private void fillHomeDataView(HomeDataView homeDataView, Date now) {
|
||||
if (null == homeDataView) {
|
||||
return;
|
||||
}
|
||||
// License
|
||||
if (null == homeDataView.getLicense()) {
|
||||
homeDataView.setLicense(new HomeDataView.License());
|
||||
}
|
||||
if (null == homeDataView.getLicense().getTotalCount()) {
|
||||
homeDataView.getLicense().setTotalCount(0);
|
||||
}
|
||||
if (null == homeDataView.getLicense().getOnlineCount()) {
|
||||
homeDataView.getLicense().setOnlineCount(0);
|
||||
}
|
||||
homeDataView.getLicense().setOfflineCount(homeDataView.getLicense().getTotalCount() - homeDataView.getLicense().getOnlineCount());
|
||||
|
||||
// PortMapping
|
||||
if (null == homeDataView.getPortMapping()) {
|
||||
homeDataView.setPortMapping(new HomeDataView.PortMapping());
|
||||
}
|
||||
if (null == homeDataView.getPortMapping().getTotalCount()) {
|
||||
homeDataView.getPortMapping().setTotalCount(0);
|
||||
}
|
||||
if (null == homeDataView.getPortMapping().getOnlineCount()) {
|
||||
homeDataView.getPortMapping().setOnlineCount(0);
|
||||
}
|
||||
homeDataView.getPortMapping().setOfflineCount(homeDataView.getPortMapping().getTotalCount() - homeDataView.getPortMapping().getOnlineCount());
|
||||
|
||||
// TodayFlow
|
||||
if (null == homeDataView.getTodayFlow()) {
|
||||
homeDataView.setTodayFlow(new HomeDataView.TodayFlow());
|
||||
}
|
||||
if (null == homeDataView.getTodayFlow().getUpFlowBytes()) {
|
||||
homeDataView.getTodayFlow().setUpFlowBytes(0L);
|
||||
}
|
||||
if (null == homeDataView.getTodayFlow().getDownFlowBytes()) {
|
||||
homeDataView.getTodayFlow().setDownFlowBytes(0L);
|
||||
}
|
||||
homeDataView.getTodayFlow().setTotalFlowBytes(homeDataView.getTodayFlow().getUpFlowBytes() + homeDataView.getTodayFlow().getDownFlowBytes());
|
||||
homeDataView.getTodayFlow().setUpFlowDesc(FormatUtil.getSizeDescByByteCount(homeDataView.getTodayFlow().getUpFlowBytes()));
|
||||
homeDataView.getTodayFlow().setDownFlowDesc(FormatUtil.getSizeDescByByteCount(homeDataView.getTodayFlow().getDownFlowBytes()));
|
||||
homeDataView.getTodayFlow().setTotalFlowDesc(FormatUtil.getSizeDescByByteCount(homeDataView.getTodayFlow().getTotalFlowBytes()));
|
||||
|
||||
// TotalFlow
|
||||
if (null == homeDataView.getTotalFlow()) {
|
||||
homeDataView.setTotalFlow(new HomeDataView.TotalFlow());
|
||||
}
|
||||
if (null == homeDataView.getTotalFlow().getUpFlowBytes()) {
|
||||
homeDataView.getTotalFlow().setUpFlowBytes(0L);
|
||||
}
|
||||
if (null == homeDataView.getTotalFlow().getDownFlowBytes()) {
|
||||
homeDataView.getTotalFlow().setDownFlowBytes(0L);
|
||||
}
|
||||
homeDataView.getTotalFlow().setTotalFlowBytes(homeDataView.getTotalFlow().getUpFlowBytes() + homeDataView.getTotalFlow().getDownFlowBytes());
|
||||
homeDataView.getTotalFlow().setUpFlowDesc(FormatUtil.getSizeDescByByteCount(homeDataView.getTotalFlow().getUpFlowBytes()));
|
||||
homeDataView.getTotalFlow().setDownFlowDesc(FormatUtil.getSizeDescByByteCount(homeDataView.getTotalFlow().getDownFlowBytes()));
|
||||
homeDataView.getTotalFlow().setTotalFlowDesc(FormatUtil.getSizeDescByByteCount(homeDataView.getTotalFlow().getTotalFlowBytes()));
|
||||
|
||||
// 最近7日流量
|
||||
HomeDataView.Last7dFlow last7dFlow = homeDataView.getLast7dFlow();
|
||||
if (null == last7dFlow) {
|
||||
last7dFlow = new HomeDataView.Last7dFlow();
|
||||
homeDataView.setLast7dFlow(last7dFlow);
|
||||
}
|
||||
if (null == last7dFlow.getDataList()) {
|
||||
last7dFlow.setDataList(Collections.emptyList());
|
||||
}
|
||||
// 数据列表
|
||||
Set<String> existDateStrList = new HashSet<>();
|
||||
if (CollectionUtil.isNotEmpty(last7dFlow.getDataList())) {
|
||||
for (HomeDataView.SingleDayFlow singleDayFlow : last7dFlow.getDataList()) {
|
||||
if (null == singleDayFlow.getUpFlowBytes()) {
|
||||
singleDayFlow.setUpFlowBytes(0L);
|
||||
}
|
||||
if (null == singleDayFlow.getDownFlowBytes()) {
|
||||
singleDayFlow.setDownFlowBytes(0L);
|
||||
}
|
||||
singleDayFlow.setTotalFlowBytes(singleDayFlow.getUpFlowBytes() + singleDayFlow.getDownFlowBytes());
|
||||
singleDayFlow.setUpFlowDesc(FormatUtil.getSizeDescByByteCount(singleDayFlow.getUpFlowBytes()));
|
||||
singleDayFlow.setDownFlowDesc(FormatUtil.getSizeDescByByteCount(singleDayFlow.getDownFlowBytes()));
|
||||
singleDayFlow.setTotalFlowDesc(FormatUtil.getSizeDescByByteCount(singleDayFlow.getTotalFlowBytes()));
|
||||
singleDayFlow.setDateStr(DateUtil.format(singleDayFlow.getDate(), "yyyy-MM-dd"));
|
||||
existDateStrList.add(singleDayFlow.getDateStr());
|
||||
}
|
||||
}
|
||||
// 获取最近7天的日期字符串列表。防止因统计数据缺失,造成图表展示错误的问题,缺失的日期数据,自动填充0
|
||||
List<String> dateList = DateUtil.getBetweenTimes(DateUtil.format(DateUtil.addDate(now, Calendar.DATE, -6), "yyyy-MM-dd"), DateUtil.format(now, "yyyy-MM-dd"));
|
||||
for (String dateStr : dateList) {
|
||||
if (existDateStrList.contains(dateStr)) {
|
||||
continue;
|
||||
}
|
||||
last7dFlow.getDataList().add(new HomeDataView.SingleDayFlow()
|
||||
.setDate(DateUtil.parse(dateStr, "yyyy-MM-dd"))
|
||||
.setDateStr(dateStr)
|
||||
.setUpFlowBytes(0L)
|
||||
.setUpFlowDesc("0B")
|
||||
.setDownFlowBytes(0L)
|
||||
.setDownFlowDesc("0B")
|
||||
.setTotalFlowBytes(0L)
|
||||
.setTotalFlowDesc("0B")
|
||||
);
|
||||
}
|
||||
|
||||
// 按日期升序
|
||||
Collections.sort(last7dFlow.getDataList(), Comparator.comparing(HomeDataView.SingleDayFlow::getDate));
|
||||
// x轴日期
|
||||
last7dFlow.setXDate(last7dFlow.getDataList().stream().map(HomeDataView.SingleDayFlow::getDateStr).collect(Collectors.toList()));
|
||||
// 图例
|
||||
last7dFlow.setLegendData(Lists.newArrayList("上行流量", "下行流量", "总流量"));
|
||||
// 折线图
|
||||
List<HomeDataView.Series> seriesList = Lists.newArrayList();
|
||||
last7dFlow.setSeriesList(seriesList);
|
||||
// 上行流量折线
|
||||
seriesList.add(new HomeDataView.Series()
|
||||
.setSeriesType("line")
|
||||
.setSeriesName(last7dFlow.getLegendData().get(0))
|
||||
.setSeriesData(last7dFlow.getDataList().stream().map(HomeDataView.SingleDayFlow::getUpFlowBytes).collect(Collectors.toList()))
|
||||
);
|
||||
// 下行流量折线
|
||||
seriesList.add(new HomeDataView.Series()
|
||||
.setSeriesType("line")
|
||||
.setSeriesName(last7dFlow.getLegendData().get(1))
|
||||
.setSeriesData(last7dFlow.getDataList().stream().map(HomeDataView.SingleDayFlow::getDownFlowBytes).collect(Collectors.toList()))
|
||||
);
|
||||
// 总流量折线
|
||||
seriesList.add(new HomeDataView.Series()
|
||||
.setSeriesType("line")
|
||||
.setSeriesName(last7dFlow.getLegendData().get(2))
|
||||
.setSeriesData(last7dFlow.getDataList().stream().map(HomeDataView.SingleDayFlow::getTotalFlowBytes).collect(Collectors.toList()))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package fun.asgc.neutrino.proxy.server.service.bo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author: aoshiguchen
|
||||
* @date: 2023/3/26
|
||||
*/
|
||||
@Data
|
||||
public class FlowBO {
|
||||
/**
|
||||
* 上行流量字节数
|
||||
*/
|
||||
private Long upFlowBytes;
|
||||
/**
|
||||
* 下行流量字节数
|
||||
*/
|
||||
private Long downFlowBytes;
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
package fun.asgc.neutrino.proxy.server.service.bo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 单日流量
|
||||
* @author: aoshiguchen
|
||||
* @date: 2023/3/26
|
||||
*/
|
||||
@Data
|
||||
public class SingleDayFlowBO {
|
||||
/**
|
||||
* 日期
|
||||
*/
|
||||
private Date date;
|
||||
/**
|
||||
* 上行流量字节数
|
||||
*/
|
||||
private Long upFlowBytes;
|
||||
/**
|
||||
* 下行流量字节数
|
||||
*/
|
||||
private Long downFlowBytes;
|
||||
}
|
||||
@@ -190,4 +190,61 @@
|
||||
</where>
|
||||
ORDER BY T2.user_id ASC,T2.license_id,T2.date DESC
|
||||
</select>
|
||||
|
||||
<select id="homeTodayFlow" resultType="fun.asgc.neutrino.proxy.server.service.bo.FlowBO">
|
||||
SELECT
|
||||
IFNULL(SUM(frm.write_bytes),0) AS 'upFlowBytes',
|
||||
IFNULL(SUM(frm.read_bytes),0) AS 'downFlowBytes'
|
||||
FROM flow_report_minute frm
|
||||
WHERE frm.date >= #{curDayBeginDate} AND frm.date <= #{curDate}
|
||||
</select>
|
||||
|
||||
<select id="homeTotalFlow" resultType="fun.asgc.neutrino.proxy.server.service.bo.FlowBO">
|
||||
SELECT
|
||||
IFNULL(SUM(T.upFlowBytes),0) AS 'upFlowBytes',
|
||||
IFNULL(SUM(T.downFlowBytes),0) AS 'downFlowBytes'
|
||||
FROM (
|
||||
(
|
||||
SELECT
|
||||
IFNULL(SUM(frm.write_bytes),0) AS 'upFlowBytes',
|
||||
IFNULL(SUM(frm.read_bytes),0) AS 'downFlowBytes'
|
||||
FROM flow_report_month frm
|
||||
) UNION ALL (
|
||||
SELECT
|
||||
IFNULL(SUM(frd.write_bytes),0) AS 'upFlowBytes',
|
||||
IFNULL(SUM(frd.read_bytes),0) AS 'downFlowBytes'
|
||||
FROM flow_report_day frd
|
||||
WHERE frd.date >= #{curMonthBeginDate} AND frd.date <= #{curDayBeginDate}
|
||||
) UNION ALL (
|
||||
SELECT
|
||||
IFNULL(SUM(frm.write_bytes),0) AS 'upFlowBytes',
|
||||
IFNULL(SUM(frm.read_bytes),0) AS 'downFlowBytes'
|
||||
FROM flow_report_minute frm
|
||||
WHERE frm.date >= #{curDayBeginDate} AND frm.date <= #{curDate}
|
||||
)
|
||||
) T
|
||||
</select>
|
||||
|
||||
<select id="homeLast7dFlowList" resultType="fun.asgc.neutrino.proxy.server.service.bo.SingleDayFlowBO">
|
||||
SELECT
|
||||
T.*
|
||||
FROM (
|
||||
(
|
||||
SELECT
|
||||
frd.date,
|
||||
IFNULL(SUM(frd.write_bytes),0) AS 'upFlowBytes',
|
||||
IFNULL(SUM(frd.read_bytes),0) AS 'downFlowBytes'
|
||||
FROM flow_report_day frd
|
||||
WHERE frd.date >= #{beginDate} AND frd.date <= #{curDayBeginDate}
|
||||
GROUP BY frd.date
|
||||
) UNION ALL (
|
||||
SELECT
|
||||
#{curDayBeginDate} AS 'date',
|
||||
IFNULL(SUM(frm.write_bytes),0) AS 'upFlowBytes',
|
||||
IFNULL(SUM(frm.read_bytes),0) AS 'downFlowBytes'
|
||||
FROM flow_report_minute frm
|
||||
WHERE frm.date >= #{curDayBeginDate} AND frm.date <= #{curDate}
|
||||
)
|
||||
) T
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user