新增首页图表接口

This commit is contained in:
aoshiguchen
2023-03-26 18:53:45 +08:00
parent 4b596e99bb
commit 07de9eec98
11 changed files with 546 additions and 88 deletions
@@ -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();
}
/**
@@ -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;
}
}
@@ -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;
}
@@ -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)
);
}
@@ -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)
);
}
@@ -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)
);
}
@@ -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);
}
@@ -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()))
);
}
}
@@ -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;
}
@@ -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 &lt;= #{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 &lt;= #{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 &lt;= #{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 &lt;= #{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 &lt;= #{curDate}
)
) T
</select>
</mapper>