diff --git a/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/service/LogBusService.java b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/service/LogBusService.java
index 89d3e41..fc3bc57 100644
--- a/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/service/LogBusService.java
+++ b/xtools-app-common/xtools-app-common-log/xtools-app-common-log-bus/src/main/java/xtools/app/common/log/bus/service/LogBusService.java
@@ -2,6 +2,9 @@ package xtools.app.common.log.bus.service;
import xtools.boot.log.model.dto.LogBody;
+import java.time.Instant;
+import java.util.Map;
+
/**
*
Title : LogBusService
* Description : LogBusService
@@ -29,4 +32,12 @@ public interface LogBusService {
*/
String total();
+ /**
+ * 获取指定日期的日志统计数据(按级别,从Redis读取)
+ *
+ * @param time 时间
+ * @return 日志级别编码 -> 数量
+ */
+ Map getTotalByDay(Instant time);
+
}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysLogTotalController.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysLogTotalController.java
index 0162b99..0df700b 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysLogTotalController.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysLogTotalController.java
@@ -1,10 +1,19 @@
package xtools.app.sys.controller;
+import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import xtools.app.sys.model.dto.req.SysLogTotalStatsReq;
+import xtools.app.sys.model.dto.resp.SysLogTotalStatsResp;
import xtools.app.sys.service.SysLogTotalService;
+import xtools.boot.api.model.dto.Result;
+
+import java.util.List;
/**
* Title : SysLogTotalController
@@ -22,4 +31,16 @@ import xtools.app.sys.service.SysLogTotalService;
public class SysLogTotalController {
private final SysLogTotalService sysLogTotalService;
+
+ /**
+ * 获取统计信息
+ *
+ * @param req 统计请求(时间范围)
+ * @return 统计信息
+ */
+ @Operation(summary = "获取统计信息")
+ @PostMapping("stats")
+ public Result> getStats(@RequestBody @Valid SysLogTotalStatsReq req) {
+ return sysLogTotalService.getStats(req);
+ }
}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/convert/SysLogTotalConvert.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/convert/SysLogTotalConvert.java
deleted file mode 100644
index ea5b7be..0000000
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/convert/SysLogTotalConvert.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package xtools.app.sys.convert;
-
-import org.mapstruct.Mapper;
-
-/**
- * Title : SysLogTotalConvert
- * Description : 系统日志统计表 Convert
- * Company : org.xujun
- *
- * @author : xujun
- * @version : 1.0.0
- * @date : 2026-07-26 11:14:47
- */
-@Mapper(componentModel = "spring")
-public interface SysLogTotalConvert {
-
-}
\ No newline at end of file
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysLogTotalMapper.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysLogTotalMapper.java
index d617d4b..c8b06a2 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysLogTotalMapper.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysLogTotalMapper.java
@@ -2,8 +2,13 @@ package xtools.app.sys.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import xtools.app.sys.model.dto.resp.SysLogTotalStatsResp;
import xtools.app.sys.model.entity.SysLogTotal;
+import java.time.Instant;
+import java.util.List;
+
/**
* Title : SysLogTotalMapper
* Description : 系统日志统计表 Mapper 接口
@@ -16,4 +21,16 @@ import xtools.app.sys.model.entity.SysLogTotal;
@Mapper
public interface SysLogTotalMapper extends BaseMapper {
+ /**
+ * 按天统计日志数量(按级别)
+ *
+ * @param startTime 开始时间(包含)
+ * @param endTime 结束时间(包含)
+ * @return 每日统计列表
+ */
+ List selectStats(
+ @Param("startTime") Instant startTime,
+ @Param("endTime") Instant endTime
+ );
+
}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/req/SysLogTotalStatsReq.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/req/SysLogTotalStatsReq.java
new file mode 100644
index 0000000..2233633
--- /dev/null
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/req/SysLogTotalStatsReq.java
@@ -0,0 +1,35 @@
+package xtools.app.sys.model.dto.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.Instant;
+
+/**
+ * Title : SysLogTotalStatsReq
+ * Description : 系统日志统计请求对象
+ * Company : org.xujun
+ *
+ * @author : xujun
+ * @version : 1.0.0
+ * @date : 2026-07-26
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class SysLogTotalStatsReq implements Serializable {
+
+ /**
+ * 数据时间范围[开始时间(包含),结束时间(包含)],不能为空且需同时包含开,结束时间
+ */
+ @NotNull(message = "时间范围不能为空")
+ @Size(min = 2, message = "时间范围需要包含开始和结束时间")
+ @Schema(description = "数据时间范围(包含两端)", example = "['2026-07-17 00:00:00', '2026-07-24 23:59:59']")
+ private Instant[] dataTimeRange;
+
+}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysLogTotalStatsResp.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysLogTotalStatsResp.java
new file mode 100644
index 0000000..596c4e4
--- /dev/null
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysLogTotalStatsResp.java
@@ -0,0 +1,57 @@
+package xtools.app.sys.model.dto.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.Instant;
+
+/**
+ * Title : SysLogTotalStatsResp
+ * Description : 系统日志每日统计响应对象(按级别)
+ * Company : org.xujun
+ *
+ * @author : xujun
+ * @version : 1.0.0
+ * @date : 2026-07-26
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SysLogTotalStatsResp implements Serializable {
+
+ /**
+ * 当天(Instant,当天 0 点)
+ */
+ @Schema(description = "当天(Instant,当天 0 点)")
+ private Instant day;
+
+ /**
+ * DEBUG 数量
+ */
+ @Schema(description = "DEBUG 数量")
+ private Long debugCount;
+
+ /**
+ * INFO 数量
+ */
+ @Schema(description = "INFO 数量")
+ private Long infoCount;
+
+ /**
+ * WARN 数量
+ */
+ @Schema(description = "WARN 数量")
+ private Long warnCount;
+
+ /**
+ * ERROR 数量
+ */
+ @Schema(description = "ERROR 数量")
+ private Long errorCount;
+
+}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysLogTotalService.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysLogTotalService.java
index aed69a9..db9eb15 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysLogTotalService.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysLogTotalService.java
@@ -1,5 +1,11 @@
package xtools.app.sys.service;
+import xtools.app.sys.model.dto.req.SysLogTotalStatsReq;
+import xtools.app.sys.model.dto.resp.SysLogTotalStatsResp;
+import xtools.boot.api.model.dto.Result;
+
+import java.util.List;
+
/**
* Title : SysLogTotalService
* Description : 系统日志统计表 Service
@@ -11,4 +17,12 @@ package xtools.app.sys.service;
*/
public interface SysLogTotalService {
+ /**
+ * 获取统计信息
+ *
+ * @param req 统计请求(时间范围)
+ * @return 统计信息
+ */
+ Result> getStats(SysLogTotalStatsReq req);
+
}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/LogBusServiceImpl.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/LogBusServiceImpl.java
index c22f040..9dce0a9 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/LogBusServiceImpl.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/LogBusServiceImpl.java
@@ -205,6 +205,7 @@ public class LogBusServiceImpl implements LogBusService, BaseParams {
* @param time 时间
* @return 统计数据
*/
+ @Override
public Map getTotalByDay(Instant time) {
Map result = new HashMap<>();
if (Objects.isNull(time)) {
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysLogTotalServiceImpl.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysLogTotalServiceImpl.java
index 987e0df..211ff87 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysLogTotalServiceImpl.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysLogTotalServiceImpl.java
@@ -3,9 +3,24 @@ package xtools.app.sys.service.impl;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
-import xtools.app.sys.convert.SysLogTotalConvert;
+import xtools.app.common.log.bus.service.LogBusService;
+import xtools.app.sys.model.dto.req.SysLogTotalStatsReq;
+import xtools.app.sys.model.dto.resp.SysLogTotalStatsResp;
import xtools.app.sys.service.SysLogTotalService;
import xtools.app.sys.service.base.SysLogTotalBaseService;
+import xtools.base.config.BaseParams;
+import xtools.boot.api.exection.BizWarning;
+import xtools.boot.api.model.dto.Result;
+import xtools.core.CollectionUtils;
+import xtools.core.enums.LogLevel;
+
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
/**
* Title : SysLogTotalServiceImpl
@@ -19,10 +34,52 @@ import xtools.app.sys.service.base.SysLogTotalBaseService;
@Primary
@Service
@RequiredArgsConstructor
-public class SysLogTotalServiceImpl implements SysLogTotalService {
+public class SysLogTotalServiceImpl implements SysLogTotalService, BaseParams {
private final SysLogTotalBaseService sysLogTotalBaseService;
- private final SysLogTotalConvert sysLogTotalConvert;
+ private final LogBusService logBusService;
+
+ /**
+ * 获取统计信息
+ * 小于今天的数据从数据库获取;包含今天的数据从Redis获取(今天尚未落库)
+ *
+ * @param req 统计请求(时间范围)
+ * @return 统计信息
+ */
+ @Override
+ public Result> getStats(SysLogTotalStatsReq req) {
+ Instant[] range = req.getDataTimeRange();
+ if (Objects.isNull(range) || range.length != CP_NUM2) {
+ throw new BizWarning("时间范围不能为空且需要包含开始和结束时间");
+ }
+ // 判断开始时间不能大于结束时间
+ Instant startTime = range[CP_NUM0];
+ Instant endTime = range[CP_NUM1];
+ if (startTime.isAfter(endTime)) {
+ throw new BizWarning("开始时间不能大于结束时间");
+ }
+ List dbList = sysLogTotalBaseService.getBaseMapper().selectStats(startTime, endTime);
+ List list = new ArrayList<>(dbList.size() + CP_NUM1);
+ if (CollectionUtils.isNotEmpty(dbList)) {
+ list.addAll(dbList);
+ }
+ // 判断是否包含今天的数据
+ long now = System.currentTimeMillis();
+ if (now >= startTime.toEpochMilli() && now <= endTime.toEpochMilli()) {
+ Instant day = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant();
+ Map totalMap = logBusService.getTotalByDay(day);
+ Long defCount = 0L;
+ // 今天的数据追加到末尾
+ list.add(SysLogTotalStatsResp.builder()
+ .day(day)
+ .debugCount(totalMap.getOrDefault(LogLevel.DEBUG.code(), defCount))
+ .infoCount(totalMap.getOrDefault(LogLevel.INFO.code(), defCount))
+ .warnCount(totalMap.getOrDefault(LogLevel.WARN.code(), defCount))
+ .errorCount(totalMap.getOrDefault(LogLevel.ERROR.code(), defCount))
+ .build());
+ }
+ return Result.ok(list);
+ }
}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysLogTotalMapper.xml b/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysLogTotalMapper.xml
new file mode 100644
index 0000000..58bc8ee
--- /dev/null
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysLogTotalMapper.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+