Files
spdm-backend-yangyang/data/src/main/resources/mapper/FileStorageMapper.xml

214 lines
8.5 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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="getdefaultNodeNameByNodeSize" resultType="java.lang.String">
select
originalName
from
(
select
file_metadata_info.originalName,
SUM(dirSize.totalSize) AS totalSize
from
(
select
fs.dirId ,
SUM(fs.fileSize) AS totalSize
from
file_storage fs
where
fs.dirId
in(select id from file_metadata_info fmi where fmi.relatedResourceUuidOwnType = #{queryNodeType} and fmi.tenantId = #{tenantId} )
group by
fs.dirId) dirSize
left join file_metadata_info ON
dirSize.dirId = file_metadata_info.id
where file_metadata_info.tenantId = #{tenantId}
group by
file_metadata_info.originalName
order by
totalSize DESC
) tmp
LIMIT #{limitNum}
</select>
<select id="selectNodeSizeByNodeType" resultType="com.sdm.data.model.dto.NodeSizeDTO">
SELECT
dirId,
SUM(fileSize) AS totalSize
FROM file_storage
WHERE
file_storage.tenantId = #{tenantId}
and
dirId IN
<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
file_storage.tenantId = #{tenantId}
and
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
file_storage.tenantId = #{tenantId}
and
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 tenantId = #{tenantId}
<if test="userIds != null and userIds.size() > 0">
AND userId IN
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
</if>
<if test="intervalMonths != null and intervalMonths > 0">
AND createTime &gt;= DATE_SUB(NOW(), INTERVAL #{intervalMonths} MONTH)
</if>
GROUP BY userId
ORDER BY totalSize DESC
<!-- 只有没传 IDs 时才限制前 10 -->
<if test="userIds == null or userIds.size() == 0">
LIMIT 10
</if>
</select>
<select id="getTotalFileSizeByCreatorAndTargetYm" resultType="com.sdm.data.model.dto.UserTotalFileSizeDTO">
WITH TargetUsers AS (
<choose>
<when test="userIds != null and userIds.size() > 0">
<!-- 直接使用传入的 ID -->
<foreach collection="userIds" item="uid" open="SELECT " separator=" UNION ALL SELECT " close="">
#{uid} as userId
</foreach>
</when>
<otherwise>
<!-- 先查出累计最大的前10人 ID -->
SELECT userId
FROM file_storage
WHERE tenantId = #{tenantId}
AND createYearMonth &lt;= #{targetYm}
GROUP BY userId
ORDER BY SUM(fileSize) DESC
LIMIT 10
</otherwise>
</choose>
)
<!-- 使用交叉连接/条件聚合,一次扫描完成统计 -->
SELECT
t.userId,
s.statDimension,
s.totalSize
FROM TargetUsers t
INNER JOIN (
-- 1. 历史累计 (内部先 SUM)
SELECT userId, 'BEFORE' as statDimension, SUM(fileSize) as totalSize
FROM file_storage
WHERE tenantId = #{tenantId} AND createYearMonth &lt; #{targetYm}
GROUP BY userId
UNION ALL
-- 2. 当月增量 (内部先 SUM)
SELECT userId, 'INCREMENT' as statDimension, SUM(fileSize) as totalSize
FROM file_storage
WHERE tenantId = #{tenantId} AND createYearMonth = #{targetYm}
GROUP BY userId
) s ON t.userId = s.userId
</select>
<select id="selectBigFiles" resultType="com.sdm.data.model.entity.FileStorage">
SELECT
distinct
file_storage.fileName,file_storage.fileId,file_storage.userGroupId,file_storage.userId,file_storage.fileSuffix,file_storage.updateTime
FROM file_metadata_info
inner join file_storage on file_storage.fileId = file_metadata_info.id
<where>
file_metadata_info.id is not null
and file_metadata_info.isLatest = #{queryBigFileReq.isLatest}
and file_metadata_info.tenantId = #{tenantId}
and file_storage.tenantId = #{tenantId}
and file_metadata_info.deletedAt IS NULL
<if test="queryBigFileReq.approveTypeList != null and queryBigFileReq.approveTypeList.size()>0">
AND file_metadata_info.approveType IN
<foreach collection="queryBigFileReq.approveTypeList" item="approveType" open="(" separator="," close=")">
#{approveType}
</foreach>
</if>
<if test="queryBigFileReq.dirIds != null and queryBigFileReq.dirIds.size()>0">
AND file_storage.dirId IN
<foreach collection="queryBigFileReq.dirIds" item="dirId" open="(" separator="," close=")">
#{dirId}
</foreach>
</if>
<if test="queryBigFileReq.fileSuffix != null and queryBigFileReq.fileSuffix != ''">
AND file_storage.fileSuffix = #{queryBigFileReq.fileSuffix}
</if>
<if test="queryBigFileReq.fileIds != null and queryBigFileReq.fileIds.size()>0">
AND file_storage.fileId IN
<foreach collection="queryBigFileReq.fileIds" item="fileId" open="(" separator="," close=")">
#{fileId}
</foreach>
</if>
<if test="queryBigFileReq.fileName != null and queryBigFileReq.fileName != ''">
AND file_storage.fileName LIKE CONCAT('%', #{queryBigFileReq.fileName}, '%')
</if>
<if test="queryBigFileReq.startTime != null">
AND file_storage.createTime &gt;= #{queryBigFileReq.startTime}
</if>
<if test="queryBigFileReq.endTime != null">
AND file_storage.createTime &lt;= #{queryBigFileReq.endTime}
</if>
<if test="fileSizeInBytes != null">
AND file_storage.fileSize &gt; #{fileSizeInBytes}
</if>
<if test="queryBigFileReq.uploadUserId != null and queryBigFileReq.uploadUserId.size()>0">
AND file_storage.userId IN
<foreach collection="queryBigFileReq.uploadUserId" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
</if>
order by file_storage.updateTime desc
</where>
</select>
</mapper>