From 07de9eec9840000c2cb1da6ad88643d66ea5ed65 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Sun, 26 Mar 2023 18:53:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=A6=96=E9=A1=B5=E5=9B=BE?= =?UTF-8?q?=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/ReportController.java | 22 +- .../controller/res/report/HomeDataView.java | 208 ++++++++++++++++++ .../res/report/ReportDataViewRes.java | 57 ----- .../proxy/server/dal/FlowReportDayMapper.java | 2 +- .../server/dal/FlowReportHourMapper.java | 2 +- .../server/dal/FlowReportMinuteMapper.java | 2 +- .../proxy/server/dal/ReportMapper.java | 33 ++- .../proxy/server/service/ReportService.java | 206 ++++++++++++++++- .../proxy/server/service/bo/FlowBO.java | 19 ++ .../server/service/bo/SingleDayFlowBO.java | 26 +++ .../main/resources/mapper/ReportMapper.xml | 57 +++++ 11 files changed, 546 insertions(+), 88 deletions(-) create mode 100644 neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/report/HomeDataView.java delete mode 100644 neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/report/ReportDataViewRes.java create mode 100644 neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/bo/FlowBO.java create mode 100644 neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/bo/SingleDayFlowBO.java diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/ReportController.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/ReportController.java index f2b04aea..6d67e612 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/ReportController.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/ReportController.java @@ -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(); } /** diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/report/HomeDataView.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/report/HomeDataView.java new file mode 100644 index 00000000..432afa14 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/report/HomeDataView.java @@ -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 dataList; + /** + * x轴日期 + */ + private List xDate; + /** + * 图例(上行流量、下行流量、总流量) + */ + private List legendData; + /** + * 折线列表 + */ + private List 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 seriesData; + } +} diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/report/ReportDataViewRes.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/report/ReportDataViewRes.java deleted file mode 100644 index ac893bd6..00000000 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/report/ReportDataViewRes.java +++ /dev/null @@ -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; -} diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportDayMapper.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportDayMapper.java index 12b2c39f..0b014810 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportDayMapper.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportDayMapper.java @@ -33,7 +33,7 @@ import java.util.List; public interface FlowReportDayMapper extends BaseMapper { default void clean(Date date) { this.delete(new LambdaQueryWrapper() - .lt(FlowReportDayDO::getCreateTime, date) + .lt(FlowReportDayDO::getDate, date) ); } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportHourMapper.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportHourMapper.java index a72f58c6..2499462e 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportHourMapper.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportHourMapper.java @@ -33,7 +33,7 @@ import java.util.List; public interface FlowReportHourMapper extends BaseMapper { default void clean(Date date) { this.delete(new LambdaQueryWrapper() - .lt(FlowReportHourDO::getCreateTime, date) + .lt(FlowReportHourDO::getDate, date) ); } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportMinuteMapper.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportMinuteMapper.java index 3ec729ba..06f367e1 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportMinuteMapper.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportMinuteMapper.java @@ -34,7 +34,7 @@ import java.util.Set; public interface FlowReportMinuteMapper extends BaseMapper { default void clean(Date date) { this.delete(new LambdaQueryWrapper() - .lt(FlowReportMinuteDO::getCreateTime, date) + .lt(FlowReportMinuteDO::getDate, date) ); } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/ReportMapper.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/ReportMapper.java index 5b0cc732..ff9ff593 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/ReportMapper.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/ReportMapper.java @@ -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 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 homeLast7dFlowList(@Param("beginDate") Date beginDate, @Param("curDayBeginDate") Date curDayBeginDate, @Param("curDate") Date curDate); } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/ReportService.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/ReportService.java index 18b41261..63588724 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/ReportService.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/ReportService.java @@ -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 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 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 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 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 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 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())) + ); + } } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/bo/FlowBO.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/bo/FlowBO.java new file mode 100644 index 00000000..903b60ae --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/bo/FlowBO.java @@ -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; +} diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/bo/SingleDayFlowBO.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/bo/SingleDayFlowBO.java new file mode 100644 index 00000000..9d6391fd --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/bo/SingleDayFlowBO.java @@ -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; +} diff --git a/neutrino-proxy-server/src/main/resources/mapper/ReportMapper.xml b/neutrino-proxy-server/src/main/resources/mapper/ReportMapper.xml index 271fb426..5e24625f 100644 --- a/neutrino-proxy-server/src/main/resources/mapper/ReportMapper.xml +++ b/neutrino-proxy-server/src/main/resources/mapper/ReportMapper.xml @@ -190,4 +190,61 @@ ORDER BY T2.user_id ASC,T2.license_id,T2.date DESC + + + + + +