diff --git a/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java b/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java
index 944e3fe..29f1bf7 100644
--- a/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java
+++ b/xtools-app-common/xtools-app-common-cache/src/main/java/xtools/app/common/cache/enums/AppCache.java
@@ -52,10 +52,11 @@ public enum AppCache implements BaseCacheEnum {
SYS_CACHE_ADDR("sys:cache:addr:", 60 * 60L),
// 天气缓存
SYS_CACHE_HOME_WEATHER("sys:cache:home:weather:", 30 * 60L),
+ // 文件存储统计缓存
+ SYS_CACHE_FILE_STATS("sys:cache:file-stats", 60 * 60L),
// 系统账号密码错误次数
- COUNT_SYS_USER_PASSWD_ERR("count:sys-user:passwd-err:", -1L)
- ;
+ COUNT_SYS_USER_PASSWD_ERR("count:sys-user:passwd-err:", -1L);
/**
* 系统缓存前缀
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysFileController.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysFileController.java
index 86d2809..f8dc500 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysFileController.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/controller/SysFileController.java
@@ -22,6 +22,7 @@ import xtools.app.sys.model.dto.req.SysFileAddReq;
import xtools.app.sys.model.dto.req.SysFileChangeReq;
import xtools.app.sys.model.dto.req.SysFilePageReq;
import xtools.app.sys.model.dto.req.SysFileUpdateReq;
+import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp;
import xtools.app.sys.model.dto.resp.SysFileResp;
import xtools.app.sys.service.SysFileService;
import xtools.boot.api.model.dto.Result;
@@ -29,6 +30,8 @@ import xtools.boot.api.model.dto.page.PageReq;
import xtools.boot.api.model.dto.page.PageResp;
import xtools.boot.api.model.dto.req.IdListReq;
+import java.util.List;
+
/**
*
Title : SysFileController
* Description : 系统文件表 Controller
@@ -113,4 +116,20 @@ public class SysFileController implements SysFileApi {
return sysFileService.changeDataTypeByIds(req);
}
+ /**
+ * 获取统计信息
+ *
+ * @param refresh 是否刷新缓存
+ * @return 统计信息
+ */
+ @Operation(summary = "获取统计信息")
+ @GetMapping("stats/{refresh}")
+ public Result> getStats(
+ @Schema(description = "是否刷新缓存")
+ @PathVariable Boolean refresh
+ ) {
+ return sysFileService.getStats(refresh);
+// return Result.ok(List.of());
+ }
+
}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysFileMapper.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysFileMapper.java
index a14d93d..a18f20d 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysFileMapper.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/mapper/SysFileMapper.java
@@ -2,8 +2,11 @@ package xtools.app.sys.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
+import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp;
import xtools.app.sys.model.entity.SysFile;
+import java.util.List;
+
/**
* Title : SysFileMapper
* Description : 系统文件表 Mapper 接口
@@ -16,4 +19,11 @@ import xtools.app.sys.model.entity.SysFile;
@Mapper
public interface SysFileMapper extends BaseMapper {
+ /**
+ * 查询每个桶的存储统计
+ *
+ * @return 桶存储统计列表
+ */
+ List selectBucketStats();
+
}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysFileBucketStatsResp.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysFileBucketStatsResp.java
new file mode 100644
index 0000000..90273db
--- /dev/null
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/model/dto/resp/SysFileBucketStatsResp.java
@@ -0,0 +1,43 @@
+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;
+
+/**
+ * Title : SysFileBucketStatsResp
+ * Description : 文件桶统计响应对象
+ * Company : org.xujun
+ *
+ * @author : xujun
+ * @version : 1.0.0
+ * @date : 2026-07-15
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SysFileBucketStatsResp implements Serializable {
+
+ /**
+ * 桶名称
+ */
+ @Schema(description = "桶名称")
+ private String bucket;
+
+ /**
+ * 文件数量
+ */
+ @Schema(description = "文件数量")
+ private Long fileCount;
+
+ /**
+ * 文件大小
+ */
+ @Schema(description = "文件大小")
+ private Long fileSize;
+}
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysFileService.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysFileService.java
index 0c4a6f3..0098edc 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysFileService.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/SysFileService.java
@@ -2,11 +2,14 @@ package xtools.app.sys.service;
import xtools.app.sys.api.SysFileApi;
import xtools.app.sys.model.dto.req.SysFilePageReq;
+import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp;
import xtools.app.sys.model.dto.resp.SysFileResp;
import xtools.boot.api.model.dto.Result;
import xtools.boot.api.model.dto.page.PageReq;
import xtools.boot.api.model.dto.page.PageResp;
+import java.util.List;
+
/**
* Title : SysFileService
* Description : 系统文件表 Service
@@ -26,6 +29,14 @@ public interface SysFileService extends SysFileApi {
*/
Result> page(PageReq pageReq);
+ /**
+ * 获取统计信息
+ *
+ * @param refresh 是否刷新缓存
+ * @return 统计信息
+ */
+ Result> getStats(Boolean refresh);
+
/**
* 定时任务
*/
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysFileServiceImpl.java b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysFileServiceImpl.java
index 9a2a180..144192c 100644
--- a/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysFileServiceImpl.java
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/java/xtools/app/sys/service/impl/SysFileServiceImpl.java
@@ -1,5 +1,6 @@
package xtools.app.sys.service.impl;
+import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -9,12 +10,14 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import xtools.app.common.cache.enums.AppCache;
import xtools.app.common.task.enums.TaskType;
import xtools.app.sys.convert.SysFileConvert;
import xtools.app.sys.model.dto.req.SysFileAddReq;
import xtools.app.sys.model.dto.req.SysFileChangeReq;
import xtools.app.sys.model.dto.req.SysFilePageReq;
import xtools.app.sys.model.dto.req.SysFileUpdateReq;
+import xtools.app.sys.model.dto.resp.SysFileBucketStatsResp;
import xtools.app.sys.model.dto.resp.SysFileResp;
import xtools.app.sys.model.entity.SysFile;
import xtools.app.sys.service.SysFileService;
@@ -27,6 +30,7 @@ import xtools.boot.api.model.dto.Result;
import xtools.boot.api.model.dto.page.PageReq;
import xtools.boot.api.model.dto.page.PageResp;
import xtools.boot.api.model.dto.req.IdListReq;
+import xtools.boot.cache.redis.base.RedisService;
import xtools.boot.db.mybatisplus.utils.QueryUtils;
import xtools.boot.log.LogBus;
import xtools.boot.log.enums.LogBusBaseType;
@@ -72,6 +76,9 @@ public class SysFileServiceImpl implements SysFileService, BaseParams {
@Resource
private StorageConfig storageConfig;
+ @Resource
+ private RedisService redisService;
+
/**
* 分页查询
*
@@ -183,6 +190,38 @@ public class SysFileServiceImpl implements SysFileService, BaseParams {
return Result.ok(changeDataType(req.getIdList(), req.getDataType()));
}
+ /**
+ * 获取统计信息
+ *
+ * @param refresh 是否刷新缓存
+ * @return 统计信息
+ */
+ @Override
+ public Result> getStats(Boolean refresh) {
+ if (Objects.isNull(refresh)) {
+ refresh = Boolean.FALSE;
+ }
+ AppCache cacheParam = AppCache.SYS_CACHE_FILE_STATS;
+ String key = cacheParam.key();
+ List dataList = null;
+ if (refresh) {
+ redisService.del(key);
+ } else {
+ JSONArray array = redisService.get(key, JSONArray.class);
+ if (CollectionUtils.isNotEmpty(array)) {
+ dataList = array.toJavaList(SysFileBucketStatsResp.class);
+ }
+ }
+ if (CollectionUtils.isNotEmpty(dataList)) {
+ return Result.ok(dataList);
+ }
+ dataList = sysFileBaseService.getBaseMapper().selectBucketStats();
+ if (CollectionUtils.isNotEmpty(dataList)) {
+ redisService.set(key, dataList, cacheParam.expireTime());
+ }
+ return Result.ok(dataList);
+ }
+
/**
* 获取分页数据
*
diff --git a/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysFileMapper.xml b/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysFileMapper.xml
new file mode 100644
index 0000000..7b48aac
--- /dev/null
+++ b/xtools-app-sys/xtools-app-sys-biz/src/main/resources/mapper/SysFileMapper.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+