数据存储分析管理
This commit is contained in:
33
data/src/main/java/com/sdm/data/dao/FileStorageMapper.java
Normal file
33
data/src/main/java/com/sdm/data/dao/FileStorageMapper.java
Normal 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);
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
99
data/src/main/resources/mapper/FileStorageMapper.xml
Normal file
99
data/src/main/resources/mapper/FileStorageMapper.xml
Normal 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 >= 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 < #{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 >= 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 < #{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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user