数据存储分析管理

This commit is contained in:
2025-11-05 14:42:56 +08:00
parent af250c9bf4
commit 1ec3950d52
10 changed files with 397 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
package com.sdm.data.dao;
import com.sdm.data.model.dto.NodeSizeDTO;
import com.sdm.data.model.dto.UserTotalFileSizeDTO;
import com.sdm.data.model.entity.FileStorage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 文件存储统计主表(支持项目/学科/用户维度的存储占用统计) Mapper 接口
* </p>
*
* @author author
* @since 2025-11-04
*/
public interface FileStorageMapper extends BaseMapper<FileStorage> {
List<NodeSizeDTO> selectNodeSizeByNodeType(@Param("directoryIds") List<Long> directoryIds,@Param("intervalMonths") Integer intervalMonths);
/**
* 批量统计项目的存储占用:目标年月之前(历史累计) + 目标年月(当月增量)
* @param dirIds 待统计的项目ID列表批量查询
* @param targetYm 目标年月格式YYYY-MM如 "2024-10",与表中 createYearMonth 一致)
* @return 统计结果列表每个项目对应2条记录历史累计 + 当月增量)
*/
List<NodeSizeDTO> statDirStorageByTargetYm(@Param("dirIds") List<Long> dirIds, @Param("targetYm") String targetYm);
List<UserTotalFileSizeDTO> getTotalFileSizeByCreator(@Param("userIds") List<Long> userIds,@Param("intervalMonths") Integer intervalMonths);
List<UserTotalFileSizeDTO> getTotalFileSizeByCreatorAndTargetYm(@Param("userIds") List<Long> userIds,@Param("targetYm") String targetYm);
}

View File

@@ -0,0 +1,16 @@
package com.sdm.data.dao;
import com.sdm.data.model.entity.FileStorageQuota;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 文件存储-用户存储配额表支持TB/GB/MB/KB多单位 Mapper 接口
* </p>
*
* @author author
* @since 2025-11-05
*/
public interface FileStorageQuotaMapper extends BaseMapper<FileStorageQuota> {
}

View File

@@ -0,0 +1,81 @@
package com.sdm.data.model.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 文件存储统计主表(支持项目/学科/用户维度的存储占用统计)
* </p>
*
* @author author
* @since 2025-11-04
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("file_storage")
@ApiModel(value="FileStorage对象", description="文件存储统计主表(支持项目/学科/用户维度的存储占用统计)")
public class FileStorage implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键ID自增")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "文件名(含后缀)")
@TableField("fileName")
private String fileName;
@ApiModelProperty(value = "文件唯一标识ID关联文件元数据表")
@TableField("fileId")
private Long fileId;
@ApiModelProperty(value = "用户组ID")
@TableField("userGroupId")
private Long userGroupId;
@ApiModelProperty(value = "文件所属用户ID")
@TableField("userId")
private Long userId;
@ApiModelProperty(value = "目录ID项目/学科等目录的唯一标识)")
@TableField("dirId")
private Long dirId;
@ApiModelProperty(value = "文件类型如txt、jpg、pdf")
@TableField("fileType")
private String fileType;
@ApiModelProperty(value = "文件大小(字节数,存储占用计算依据)")
@TableField("fileSize")
private Long fileSize;
@ApiModelProperty(value = "文件创建时间(精确到秒,自动填充当前时间)")
@TableField("createTime")
private LocalDateTime createTime;
@ApiModelProperty(value = "记录更新时间(自动更新)")
@TableField("updateTime")
private LocalDateTime updateTime;
@ApiModelProperty(value = "文件完整路径(冗余字段,优化查询)")
@TableField("fullPath")
private String fullPath;
@ApiModelProperty(value = "创建时间年月冗余列格式YYYY-MM用于分组统计")
@TableField("createYearMonth")
private String createYearMonth;
}

View File

@@ -0,0 +1,56 @@
package com.sdm.data.model.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 文件存储-用户存储配额表支持TB/GB/MB/KB多单位
* </p>
*
* @author author
* @since 2025-11-05
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("file_storage_quota")
@ApiModel(value="FileStorageQuota对象", description="文件存储-用户存储配额表支持TB/GB/MB/KB多单位")
public class FileStorageQuota implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键ID自增")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "关联用户表sys_user的id唯一标识用户")
@TableField("userId")
private Long userId;
@ApiModelProperty(value = "存储阈值(单位:字节)")
@TableField("quotaValue")
private Long quotaValue;
@ApiModelProperty(value = "阈值显示单位枚举TB/GB/MB/KB")
@TableField("quotaUnit")
private String quotaUnit;
@ApiModelProperty(value = "已使用存储(单位:字节)")
@TableField("usedValue")
private Long usedValue;
@ApiModelProperty(value = "配额状态枚举NORMAL-正常/WARNING-临界/EXCEED-超限)")
@TableField("status")
private String status;
}

View File

@@ -0,0 +1,16 @@
package com.sdm.data.service;
import com.sdm.data.model.entity.FileStorageQuota;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 文件存储-用户存储配额表支持TB/GB/MB/KB多单位 服务类
* </p>
*
* @author author
* @since 2025-11-05
*/
public interface IFileStorageQuotaService extends IService<FileStorageQuota> {
}

View File

@@ -0,0 +1,28 @@
package com.sdm.data.service;
import com.sdm.data.model.dto.NodeSizeDTO;
import com.sdm.data.model.dto.UserTotalFileSizeDTO;
import com.sdm.data.model.entity.FileStorage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 文件存储统计主表(支持项目/学科/用户维度的存储占用统计) 服务类
* </p>
*
* @author author
* @since 2025-11-04
*/
public interface IFileStorageService extends IService<FileStorage> {
List<NodeSizeDTO> selectNodeSizeByNodeType(List<Long> directoryIds,Integer intervalMonths);
List<NodeSizeDTO> statDirStorageByTargetYm(List<Long> dirIds, String targetYm);
List<UserTotalFileSizeDTO> getTotalFileSizeByCreator(List<Long> userIds,Integer intervalMonths);
List<UserTotalFileSizeDTO> getTotalFileSizeByCreatorAndTargetYm(List<Long> userIds,String targetYm);
}

View File

@@ -0,0 +1,20 @@
package com.sdm.data.service.impl;
import com.sdm.data.model.entity.FileStorageQuota;
import com.sdm.data.dao.FileStorageQuotaMapper;
import com.sdm.data.service.IFileStorageQuotaService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 文件存储-用户存储配额表支持TB/GB/MB/KB多单位 服务实现类
* </p>
*
* @author author
* @since 2025-11-05
*/
@Service
public class FileStorageQuotaServiceImpl extends ServiceImpl<FileStorageQuotaMapper, FileStorageQuota> implements IFileStorageQuotaService {
}

View File

@@ -0,0 +1,43 @@
package com.sdm.data.service.impl;
import com.sdm.data.model.dto.NodeSizeDTO;
import com.sdm.data.model.dto.UserTotalFileSizeDTO;
import com.sdm.data.model.entity.FileStorage;
import com.sdm.data.dao.FileStorageMapper;
import com.sdm.data.service.IFileStorageService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 文件存储统计主表(支持项目/学科/用户维度的存储占用统计) 服务实现类
* </p>
*
* @author author
* @since 2025-11-04
*/
@Service
public class FileStorageServiceImpl extends ServiceImpl<FileStorageMapper, FileStorage> implements IFileStorageService {
@Override
public List<NodeSizeDTO> selectNodeSizeByNodeType(List<Long> directoryIds, Integer intervalMonths) {
return baseMapper.selectNodeSizeByNodeType(directoryIds, intervalMonths);
}
@Override
public List<NodeSizeDTO> statDirStorageByTargetYm(List<Long> dirIds, String targetYm) {
return baseMapper.statDirStorageByTargetYm(dirIds, targetYm);
}
@Override
public List<UserTotalFileSizeDTO> getTotalFileSizeByCreator(List<Long> userIds, Integer intervalMonths) {
return baseMapper.getTotalFileSizeByCreator(userIds, intervalMonths);
}
@Override
public List<UserTotalFileSizeDTO> getTotalFileSizeByCreatorAndTargetYm(List<Long> userIds, String targetYm) {
return baseMapper.getTotalFileSizeByCreatorAndTargetYm(userIds, targetYm);
}
}

View File

@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sdm.data.dao.FileStorageMapper">
<select id="selectNodeSizeByNodeType" resultType="com.sdm.data.model.dto.NodeSizeDTO">
SELECT
dirId,
SUM(fileSize) AS totalSize
FROM file_storage
WHERE dirId
<foreach collection="directoryIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
<if test="intervalMonths != null and intervalMonths > 0">
AND createTime &gt;= DATE_SUB(NOW(), INTERVAL #{intervalMonths} MONTH)
</if>
GROUP BY dirId;
</select>
<select id="statDirStorageByTargetYm" resultType="com.sdm.data.model.dto.NodeSizeDTO">
<!-- 1. 统计:目标年月之前的历史累计存储(不包含目标年月) -->
SELECT
dirId,
BEFORE AS statDimension, -- 示例BEFORE_202410
SUM(fileSize) AS totalSize -- 总占用字节数(原始单位)
FROM file_storage
WHERE
dirId IN
<foreach collection="dirIds" item="dirId" open="(" separator="," close=")">
#{dirId}
</foreach>
AND createYearMonth &lt; #{targetYm}
GROUP BY dirId
UNION ALL
<!-- 2. 统计:目标年月的当月增量存储(仅包含目标年月) -->
SELECT
dirId,
INCREMENT AS statDimension, -- 示例INCREMENT_202410
SUM(fileSize) AS totalSize
FROM file_storage
WHERE
dirId IN
<foreach collection="dirIds" item="dirId" open="(" separator="," close=")">
#{dirId}
</foreach>
AND createYearMonth = #{targetYm}
GROUP BY dirId
</select>
<select id="getTotalFileSizeByCreator" resultType="com.sdm.data.model.dto.UserTotalFileSizeDTO">
SELECT
userId,
SUM(fileSize) AS totalSize
FROM file_storage
WHERE userId IN
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
<if test="intervalMonths != null and intervalMonths > 0">
AND createTime &gt;= DATE_SUB(NOW(), INTERVAL #{intervalMonths} MONTH)
</if>
GROUP BY userId;
</select>
<select id="getTotalFileSizeByCreatorAndTargetYm" resultType="com.sdm.data.model.dto.UserTotalFileSizeDTO">
<!-- 目标年月之前(历史累计,不包含目标年月) -->
SELECT
userId,
'BEFORE' AS statDimension,
SUM(fileSize) AS totalSize
FROM file_storage
WHERE userId IN
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
AND createYearMonth &lt; #{targetYm}
GROUP BY userId
UNION ALL
<!-- 目标年月(当月增量,仅包含目标年月) -->
SELECT
userId AS dirId,
'INCREMENT' AS statDimension,
SUM(fileSize) AS totalSize
FROM file_storage
WHERE userId IN
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
AND createYearMonth = #{targetYm}
GROUP BY userId
</select>
</mapper>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sdm.data.dao.FileStorageQuotaMapper">
</mapper>