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 new file mode 100644 index 00000000..73d542b6 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/FlowReportDayMapper.java @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package fun.asgc.neutrino.proxy.server.dal; + +import fun.asgc.neutrino.core.annotation.Component; +import fun.asgc.neutrino.core.annotation.Param; +import fun.asgc.neutrino.core.aop.Intercept; +import fun.asgc.neutrino.core.db.annotation.Delete; +import fun.asgc.neutrino.core.db.annotation.Insert; +import fun.asgc.neutrino.core.db.annotation.Select; +import fun.asgc.neutrino.core.db.mapper.SqlMapper; +import fun.asgc.neutrino.proxy.server.dal.entity.FlowReportDayDO; + +/** + * @author: aoshiguchen + * @date: 2022/10/28 + */ +@Intercept(ignoreGlobal = true) +@Component +public interface FlowReportDayMapper extends SqlMapper { + @Select("select * from flow_report_day where license_id = :licenseId and date_str = :dateStr") + FlowReportDayDO findOne(@Param("licenseId") Integer licenseId, @Param("dateStr") String dateStr); + + @Insert("insert into flow_report_day(`user_id`,`license_id`,`write_bytes`,`read_bytes`,`date`,`date_str`,`create_time`) values(:userId,:licenseId,:writeBytes,:readBytes,:date,:dateStr,:createTime)") + void add(FlowReportDayDO flowReportDayDO); + + @Delete("delete from flow_report_day where date_str = :dateStr") + void deleteByDateStr(@Param("dateStr") String dateStr); +} 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 822a2a19..f981e6ca 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 @@ -26,10 +26,14 @@ import fun.asgc.neutrino.core.annotation.Param; import fun.asgc.neutrino.core.aop.Intercept; import fun.asgc.neutrino.core.db.annotation.Delete; import fun.asgc.neutrino.core.db.annotation.Insert; +import fun.asgc.neutrino.core.db.annotation.ResultType; import fun.asgc.neutrino.core.db.annotation.Select; import fun.asgc.neutrino.core.db.mapper.SqlMapper; import fun.asgc.neutrino.proxy.server.dal.entity.FlowReportHourDO; +import java.util.Date; +import java.util.List; + /** * @author: aoshiguchen * @date: 2022/10/28 @@ -37,12 +41,17 @@ import fun.asgc.neutrino.proxy.server.dal.entity.FlowReportHourDO; @Intercept(ignoreGlobal = true) @Component public interface FlowReportHourMapper extends SqlMapper { - @Select("select * from flow_report_hour where license_id = :licenseId and date = :date") - FlowReportHourDO findOne(@Param("licenseId") Integer licenseId, @Param("date") String date); + @Select("select * from flow_report_hour where license_id = :licenseId and date_str = :dateStr") + FlowReportHourDO findOne(@Param("licenseId") Integer licenseId, @Param("dateStr") String dateStr); @Insert("insert into flow_report_hour(`user_id`,`license_id`,`write_bytes`,`read_bytes`,`date`,`date_str`,`create_time`) values(:userId,:licenseId,:writeBytes,:readBytes,:date,:dateStr,:createTime)") void add(FlowReportHourDO flowReportHourDO); @Delete("delete from flow_report_hour where date_str = :dateStr") void deleteByDateStr(@Param("dateStr") String dateStr); + + @ResultType(FlowReportHourDO.class) + @Select("select * from flow_report_hour where date >= :startDate and date <= :endDate") + List findListByDateRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate); + } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/entity/FlowReportDayDO.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/entity/FlowReportDayDO.java new file mode 100644 index 00000000..9e6dee20 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/dal/entity/FlowReportDayDO.java @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package fun.asgc.neutrino.proxy.server.dal.entity; + +import fun.asgc.neutrino.core.db.annotation.Id; +import fun.asgc.neutrino.core.db.annotation.Table; +import lombok.Data; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author: aoshiguchen + * @date: 2022/10/24 + */ +@ToString +@Accessors(chain = true) +@Data +@Table("flow_report_day") +public class FlowReportDayDO { + @Id + private Integer id; + /** + * 用户ID + */ + private Integer userId; + /** + * licenseId + */ + private Integer licenseId; + /** + * 写入字节数 + */ + private Long writeBytes; + /** + * 读取字节数 + */ + private Long readBytes; + /** + * 报表统计时间 + */ + private Date date; + /** + * 报表统计时间 + * yyyy-MM-dd HH + */ + private String dateStr; + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/FlowReportForDayJob.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/FlowReportForDayJob.java new file mode 100644 index 00000000..9ca2a53e --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/job/FlowReportForDayJob.java @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package fun.asgc.neutrino.proxy.server.job; + +import fun.asgc.neutrino.core.annotation.Autowired; +import fun.asgc.neutrino.core.annotation.Component; +import fun.asgc.neutrino.core.annotation.NonIntercept; +import fun.asgc.neutrino.core.quartz.IJobHandler; +import fun.asgc.neutrino.core.quartz.annotation.JobHandler; +import fun.asgc.neutrino.core.util.CollectionUtil; +import fun.asgc.neutrino.core.util.DateUtil; +import fun.asgc.neutrino.proxy.server.dal.FlowReportDayMapper; +import fun.asgc.neutrino.proxy.server.dal.FlowReportHourMapper; +import fun.asgc.neutrino.proxy.server.dal.FlowReportMinuteMapper; +import fun.asgc.neutrino.proxy.server.dal.LicenseMapper; +import fun.asgc.neutrino.proxy.server.dal.entity.FlowReportDayDO; +import fun.asgc.neutrino.proxy.server.dal.entity.FlowReportHourDO; +import fun.asgc.neutrino.proxy.server.service.FlowReportService; +import lombok.extern.slf4j.Slf4j; + +import java.util.*; + +/** + * @author: aoshiguchen + * @date: 2022/10/28 + */ +@Slf4j +@NonIntercept +@Component +@JobHandler(name = "FlowReportForDayJob", cron = "0 0 1 * * ?", param = "") +public class FlowReportForDayJob implements IJobHandler { + @Autowired + private FlowReportService flowReportService; + @Autowired + private LicenseMapper licenseMapper; + @Autowired + private FlowReportMinuteMapper flowReportMinuteMapper; + @Autowired + private FlowReportHourMapper flowReportHourMapper; + @Autowired + private FlowReportDayMapper flowReportDayMapper; + + @Override + public void execute(String param) throws Exception { + Date now = new Date(); + String dateStr = DateUtil.format(DateUtil.addDate(now, Calendar.DATE, -1), "yyyy-MM-dd"); + Date date = DateUtil.parse(dateStr, "yyyy-MM-dd"); + Date startHourDate = DateUtil.getDayBegin(date); + Date endHourDate = DateUtil.getDayEnd(date); + + // 删除原来的记录 + flowReportDayMapper.deleteByDateStr(dateStr); + + // 查询前一天的小时级别统计数据 + List flowReportHourDOList = flowReportHourMapper.findListByDateRange(startHourDate, endHourDate); + if (CollectionUtil.isEmpty(flowReportHourDOList)) { + return; + } + + // 汇总前一个天的天级别统计数据 + Map map = new HashMap<>(); + for (FlowReportHourDO item : flowReportHourDOList) { + FlowReportDayDO report = map.get(item.getLicenseId()); + if (null == report) { + report = new FlowReportDayDO(); + map.put(item.getLicenseId(), report); + } + Long writeBytes = report.getWriteBytes() == null ? 0 : report.getWriteBytes(); + Long readBytes = report.getReadBytes() == null ? 0 : report.getReadBytes(); + + report.setUserId(item.getUserId()); + report.setLicenseId(item.getLicenseId()); + report.setWriteBytes(writeBytes + item.getWriteBytes()); + report.setReadBytes(readBytes + item.getReadBytes()); + report.setDate(date); + report.setDateStr(dateStr); + report.setCreateTime(now); + } + + for (FlowReportDayDO item : map.values()) { + flowReportDayMapper.add(item); + } + } + +} diff --git a/neutrino-proxy-server/src/main/resources/sql/init-structure.sql b/neutrino-proxy-server/src/main/resources/sql/init-structure.sql index 97cfba85..ae0762c8 100644 --- a/neutrino-proxy-server/src/main/resources/sql/init-structure.sql +++ b/neutrino-proxy-server/src/main/resources/sql/init-structure.sql @@ -158,7 +158,7 @@ CREATE TABLE IF NOT EXISTS `flow_report_hour` ( `date` INTEGER(20) NOT NULL, `date_str` VARCHAR(20) NOT NULL, `create_time` INTEGER(20) NOT NULL - ); +); CREATE INDEX IF NOT EXISTS I_flow_report_hour_create_time ON flow_report_hour(create_time); CREATE INDEX IF NOT EXISTS I_flow_report_hour_date ON flow_report_hour(`date`); CREATE INDEX IF NOT EXISTS I_flow_report_hour_user_id ON flow_report_hour(`user_id`); @@ -174,7 +174,7 @@ CREATE TABLE IF NOT EXISTS `flow_report_day` ( `date` INTEGER(20) NOT NULL, `date_str` VARCHAR(20) NOT NULL, `create_time` INTEGER(20) NOT NULL - ); +); CREATE INDEX IF NOT EXISTS I_flow_report_day_create_time ON flow_report_day(create_time); CREATE INDEX IF NOT EXISTS I_flow_report_day_date ON flow_report_day(`date`); CREATE INDEX IF NOT EXISTS I_flow_report_day_user_id ON flow_report_day(`user_id`); @@ -190,7 +190,7 @@ CREATE TABLE IF NOT EXISTS `flow_report_month` ( `date` INTEGER(20) NOT NULL, `date_str` VARCHAR(20) NOT NULL, `create_time` INTEGER(20) NOT NULL - ); +); CREATE INDEX IF NOT EXISTS I_flow_report_month_create_time ON flow_report_month(create_time); CREATE INDEX IF NOT EXISTS I_flow_report_month_date ON flow_report_month(`date`); CREATE INDEX IF NOT EXISTS I_flow_report_month_user_id ON flow_report_month(`user_id`); diff --git a/neutrino-proxy-server/src/main/resources/sql/job_info.data.sql b/neutrino-proxy-server/src/main/resources/sql/job_info.data.sql index 10f27303..67320131 100644 --- a/neutrino-proxy-server/src/main/resources/sql/job_info.data.sql +++ b/neutrino-proxy-server/src/main/resources/sql/job_info.data.sql @@ -6,4 +6,6 @@ INSERT INTO job_info(`id`, `desc`, `handler`, `cron`, `param`, `enable`, `create INSERT INTO job_info(`id`, `desc`, `handler`, `cron`, `param`, `enable`, `create_time`, `update_time`) VALUES (3, '流量统计报表-分钟', 'FlowReportForMinuteJob', '0 */1 * * * ?', '', 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); INSERT INTO job_info(`id`, `desc`, `handler`, `cron`, `param`, `enable`, `create_time`, `update_time`) VALUES -(4, '流量统计报表-小时', 'FlowReportForHourJob', '0 0 */1 * * ?', '', 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); \ No newline at end of file +(4, '流量统计报表-小时', 'FlowReportForHourJob', '0 0 */1 * * ?', '', 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); +INSERT INTO job_info(`id`, `desc`, `handler`, `cron`, `param`, `enable`, `create_time`, `update_time`) VALUES +(5, '流量统计报表-天', 'FlowReportForDayJob', '0 0 1 * * ?', '', 1, STRFTIME('%s000', 'NOW'), STRFTIME('%s000', 'NOW')); \ No newline at end of file