From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master
---
jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsMapper/DmsFileCenterMapper.java | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 250 insertions(+), 0 deletions(-)
diff --git a/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsMapper/DmsFileCenterMapper.java b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsMapper/DmsFileCenterMapper.java
new file mode 100644
index 0000000..1b50666
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsMapper/DmsFileCenterMapper.java
@@ -0,0 +1,250 @@
+package jnpf.dmsMapper;
+
+import jnpf.dmsEntity.permission.vo.DmsFileCenterItemVO;
+import jnpf.dmsPermission.DmsFileCenterQuery;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface DmsFileCenterMapper {
+ String ACTIVE_READ = "p.tenant_id = #{q.tenantId} AND p.action_code = 'READ' "
+ + "AND p.revoked_at IS NULL AND p.valid_from <= CURRENT_TIMESTAMP "
+ + "AND (p.valid_to IS NULL OR CURRENT_TIMESTAMP < p.valid_to) "
+ + "AND (p.max_use_count IS NULL OR p.used_count < p.max_use_count) ";
+
+ String PRINCIPAL_MATCH = "AND ((p.principal_type = 'USER' AND p.principal_id = #{q.userId}) "
+ + "<if test='q.directOrgIds != null and !q.directOrgIds.isEmpty()'> "
+ + "OR (p.principal_type = 'ORG' AND p.include_child_orgs = FALSE AND p.principal_id IN "
+ + "<foreach collection='q.directOrgIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) "
+ + "</if> "
+ + "<if test='q.ancestorOrgIds != null and !q.ancestorOrgIds.isEmpty()'> "
+ + "OR (p.principal_type = 'ORG' AND p.include_child_orgs = TRUE AND p.principal_id IN "
+ + "<foreach collection='q.ancestorOrgIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) "
+ + "</if> "
+ + "<if test='q.positionIds != null and !q.positionIds.isEmpty()'> "
+ + "OR (p.principal_type = 'POSITION' AND p.principal_id IN "
+ + "<foreach collection='q.positionIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) "
+ + "</if> "
+ + "<if test='q.roleIds != null and !q.roleIds.isEmpty()'> "
+ + "OR (p.principal_type = 'ROLE' AND p.principal_id IN "
+ + "<foreach collection='q.roleIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) "
+ + "</if> "
+ + "<if test='q.permissionGroupIds != null and !q.permissionGroupIds.isEmpty()'> "
+ + "OR (p.principal_type = 'GROUP' AND p.principal_id IN "
+ + "<foreach collection='q.permissionGroupIds' item='id' open='(' separator=',' close=')'>#{id}</foreach>) "
+ + "</if>) ";
+
+ String FOLDER_ANCESTORS = "WITH RECURSIVE folder_ancestors(id, parent_id) AS ( "
+ + "SELECT f.id, f.parent_id FROM public.dms_folders f "
+ + "WHERE f.tenant_id = #{q.tenantId} AND f.id = #{q.folderId} "
+ + "UNION ALL SELECT parent.id, parent.parent_id FROM folder_ancestors child "
+ + "JOIN public.dms_folders parent ON parent.tenant_id = #{q.tenantId} "
+ + "AND parent.id = child.parent_id) ";
+
+ String VERSION_COLUMNS = "v.id, 'FILE_VERSION' AS resource_type, d.folder_id AS parent_id, "
+ + "d.name, d.id AS document_id, d.document_no, d.document_type, d.responsible_dept_id, "
+ + "v.version_no, v.version_label, v.file_name, v.mime_type, v.size_bytes, "
+ + "v.checksum_sha256, v.prepared_by, v.prepared_on, s.lifecycle_status, "
+ + "s.effective_from, s.effective_to, v.created_at ";
+
+ String ACTIVE_EXCLUSION = "e.tenant_id = #{q.tenantId} AND e.user_id = #{q.userId} "
+ + "AND e.action_code = 'READ' AND e.revoked_at IS NULL "
+ + "AND e.valid_from <= CURRENT_TIMESTAMP "
+ + "AND (e.valid_to IS NULL OR CURRENT_TIMESTAMP < e.valid_to) ";
+
+ String SHARED_ELIGIBLE_VERSIONS = "WITH eligible_versions(file_version_id) AS ( "
+ + "<choose><when test='q.administrator'> "
+ + "SELECT s.file_version_id FROM public.dms_version_states s "
+ + "WHERE s.tenant_id = #{q.tenantId} "
+ + "</when><otherwise> "
+ + "SELECT s.file_version_id FROM public.dms_file_permissions p "
+ + "JOIN public.dms_version_states s ON s.tenant_id = p.tenant_id "
+ + "AND s.document_id = p.resource_id WHERE " + ACTIVE_READ + PRINCIPAL_MATCH
+ + "AND p.resource_type = 'DOCUMENT' "
+ + "UNION SELECT p.resource_id FROM public.dms_file_permissions p WHERE "
+ + ACTIVE_READ + PRINCIPAL_MATCH + "AND p.resource_type = 'FILE_VERSION' "
+ + "</otherwise></choose>) ";
+
+ @Select({"<script>",
+ "WITH RECURSIVE parent_ancestors(id, parent_id) AS (",
+ "<choose>",
+ "<when test='q.parentId != null'>",
+ "SELECT f.id, f.parent_id FROM public.dms_folders f",
+ "WHERE f.tenant_id = #{q.tenantId} AND f.id = #{q.parentId}",
+ "</when>",
+ "<otherwise>SELECT NULL::UUID, NULL::UUID WHERE FALSE</otherwise>",
+ "</choose>",
+ "UNION ALL SELECT parent.id, parent.parent_id FROM parent_ancestors child",
+ "JOIN public.dms_folders parent ON parent.tenant_id = #{q.tenantId}",
+ "AND parent.id = child.parent_id)",
+ "<if test='!q.administrator'>",
+ ", authorized_navigation_ancestors(id, parent_id) AS (",
+ "SELECT granted.id, granted.parent_id FROM public.dms_file_permissions p",
+ "JOIN public.dms_folders granted ON granted.tenant_id = p.tenant_id",
+ "AND granted.id = p.resource_id WHERE", ACTIVE_READ, PRINCIPAL_MATCH,
+ "AND p.resource_type = 'FOLDER'",
+ "UNION SELECT parent.id, parent.parent_id FROM authorized_navigation_ancestors child",
+ "JOIN public.dms_folders parent ON parent.tenant_id = #{q.tenantId}",
+ "AND parent.id = child.parent_id)",
+ "</if>",
+ "SELECT f.id, 'FOLDER' AS resource_type, f.parent_id, f.name, f.created_at",
+ "FROM public.dms_folders f",
+ "WHERE f.tenant_id = #{q.tenantId}",
+ "<choose>",
+ "<when test='q.parentId == null'>AND f.parent_id IS NULL</when>",
+ "<otherwise>AND f.parent_id = #{q.parentId}</otherwise>",
+ "</choose>",
+ "<if test='q.cursorName != null'>",
+ "AND (f.name > #{q.cursorName} OR (f.name = #{q.cursorName} AND f.id > #{q.cursorId}))",
+ "</if>",
+ "<if test='!q.administrator'>",
+ "AND (EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE", ACTIVE_READ, PRINCIPAL_MATCH,
+ "AND p.resource_type = 'FOLDER' AND (p.resource_id = f.id OR",
+ "(p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM parent_ancestors))))",
+ "OR f.id IN (SELECT id FROM authorized_navigation_ancestors))",
+ "</if>",
+ "ORDER BY f.name, f.id LIMIT #{q.limit}",
+ "</script>"})
+ List<DmsFileCenterItemVO> selectFolders(@Param("q") DmsFileCenterQuery query);
+
+ @Select({"<script>", FOLDER_ANCESTORS,
+ "SELECT", VERSION_COLUMNS,
+ "FROM public.dms_documents d",
+ "JOIN public.dms_version_states s ON s.tenant_id = d.tenant_id AND s.document_id = d.id",
+ "JOIN public.dms_file_versions v ON v.tenant_id = s.tenant_id",
+ "AND v.document_id = s.document_id AND v.id = s.file_version_id",
+ "WHERE d.tenant_id = #{q.tenantId} AND d.folder_id = #{q.folderId}",
+ "AND s.lifecycle_status = 'EFFECTIVE' AND s.effective_from <= CURRENT_TIMESTAMP",
+ "AND (s.effective_to IS NULL OR CURRENT_TIMESTAMP < s.effective_to)",
+ "<if test='q.keyword != null'>AND d.name LIKE CONCAT(#{q.keyword}, '%')</if>",
+ "<if test='q.cursorName != null'>",
+ "AND (d.name > #{q.cursorName} OR",
+ "(d.name = #{q.cursorName} AND d.id > #{q.cursorDocumentId}))",
+ "</if>",
+ "<if test='!q.administrator'>",
+ "AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE", ACTIVE_EXCLUSION,
+ "AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)",
+ "OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))",
+ "AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE", ACTIVE_READ, PRINCIPAL_MATCH,
+ "AND p.resource_type = 'FOLDER' AND (p.resource_id = #{q.folderId}",
+ "OR (p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM folder_ancestors))))",
+ "</if>",
+ "ORDER BY d.name, d.id LIMIT #{q.limit}",
+ "</script>"})
+ List<DmsFileCenterItemVO> selectCurrentDocuments(@Param("q") DmsFileCenterQuery query);
+
+ @Select({"<script>", FOLDER_ANCESTORS,
+ "SELECT", VERSION_COLUMNS,
+ "FROM public.dms_documents d",
+ "JOIN public.dms_file_versions v ON v.tenant_id = d.tenant_id AND v.document_id = d.id",
+ "JOIN public.dms_version_states s ON s.tenant_id = v.tenant_id",
+ "AND s.document_id = v.document_id AND s.file_version_id = v.id",
+ "WHERE d.tenant_id = #{q.tenantId} AND d.folder_id = #{q.folderId}",
+ "AND s.lifecycle_status IN ('SUPERSEDED', 'EXPIRED', 'REVOKED', 'INVALIDATED', 'OBSOLETE')",
+ "<if test='q.keyword != null'>AND d.name LIKE CONCAT(#{q.keyword}, '%')</if>",
+ "<if test='q.cursorName != null'>",
+ "AND (d.name > #{q.cursorName}",
+ "OR (d.name = #{q.cursorName} AND d.id > #{q.cursorDocumentId})",
+ "OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId}",
+ "AND v.version_no < #{q.cursorVersionNo})",
+ "OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId}",
+ "AND v.version_no = #{q.cursorVersionNo} AND v.id < #{q.cursorId}))",
+ "</if>",
+ "<if test='!q.administrator'>",
+ "AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE", ACTIVE_EXCLUSION,
+ "AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)",
+ "OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))",
+ "AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE", ACTIVE_READ, PRINCIPAL_MATCH,
+ "AND p.resource_type = 'FOLDER' AND (p.resource_id = #{q.folderId}",
+ "OR (p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM folder_ancestors))))",
+ "</if>",
+ "ORDER BY d.name, d.id, v.version_no DESC, v.id DESC LIMIT #{q.limit}",
+ "</script>"})
+ List<DmsFileCenterItemVO> selectHistoricalVersions(@Param("q") DmsFileCenterQuery query);
+
+ @Select({"<script>",
+ "WITH RECURSIVE folder_ancestors(id, parent_id) AS (",
+ "SELECT f.id, f.parent_id FROM public.dms_folders f",
+ "JOIN public.dms_documents start_document ON start_document.tenant_id = f.tenant_id",
+ "AND start_document.folder_id = f.id",
+ "WHERE f.tenant_id = #{q.tenantId} AND start_document.id = #{q.documentId}",
+ "UNION ALL SELECT parent.id, parent.parent_id FROM folder_ancestors child",
+ "JOIN public.dms_folders parent ON parent.tenant_id = #{q.tenantId}",
+ "AND parent.id = child.parent_id)",
+ "SELECT", VERSION_COLUMNS,
+ "FROM public.dms_documents d",
+ "JOIN public.dms_file_versions v ON v.tenant_id = d.tenant_id AND v.document_id = d.id",
+ "JOIN public.dms_version_states s ON s.tenant_id = v.tenant_id",
+ "AND s.document_id = v.document_id AND s.file_version_id = v.id",
+ "WHERE d.tenant_id = #{q.tenantId} AND d.id = #{q.documentId}",
+ "AND s.lifecycle_status IN ('SUPERSEDED', 'EXPIRED', 'REVOKED', 'INVALIDATED', 'OBSOLETE')",
+ "<if test='q.cursorVersionNo != null'>",
+ "AND (v.version_no < #{q.cursorVersionNo}",
+ "OR (v.version_no = #{q.cursorVersionNo} AND v.id < #{q.cursorId}))",
+ "</if>",
+ "<if test='!q.administrator'>",
+ "AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE", ACTIVE_EXCLUSION,
+ "AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)",
+ "OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))",
+ "AND EXISTS (SELECT 1 FROM public.dms_file_permissions p WHERE", ACTIVE_READ, PRINCIPAL_MATCH,
+ "AND ((p.resource_type = 'DOCUMENT' AND p.resource_id = d.id)",
+ "OR (p.resource_type = 'FILE_VERSION' AND p.resource_id = v.id)",
+ "OR (p.resource_type = 'FOLDER' AND (p.resource_id = d.folder_id",
+ "OR (p.resource_scope = 'SUBTREE' AND p.resource_id IN (SELECT id FROM folder_ancestors))))))",
+ "</if>",
+ "ORDER BY v.version_no DESC, v.id DESC LIMIT #{q.limit}",
+ "</script>"})
+ List<DmsFileCenterItemVO> selectDocumentVersions(@Param("q") DmsFileCenterQuery query);
+
+ @Select({"<script>", SHARED_ELIGIBLE_VERSIONS,
+ "SELECT", VERSION_COLUMNS,
+ "FROM public.dms_documents d",
+ "JOIN public.dms_version_states s ON s.tenant_id = d.tenant_id AND s.document_id = d.id",
+ "JOIN public.dms_file_versions v ON v.tenant_id = s.tenant_id",
+ "AND v.document_id = s.document_id AND v.id = s.file_version_id",
+ "JOIN eligible_versions allowed ON allowed.file_version_id = v.id",
+ "WHERE d.tenant_id = #{q.tenantId}",
+ "AND s.lifecycle_status = 'EFFECTIVE' AND s.effective_from <= CURRENT_TIMESTAMP",
+ "AND (s.effective_to IS NULL OR CURRENT_TIMESTAMP < s.effective_to)",
+ "<if test='q.cursorName != null'>",
+ "AND (d.name > #{q.cursorName} OR",
+ "(d.name = #{q.cursorName} AND d.id > #{q.cursorDocumentId}))",
+ "</if>",
+ "<if test='!q.administrator'>",
+ "AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE", ACTIVE_EXCLUSION,
+ "AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)",
+ "OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))",
+ "</if>",
+ "ORDER BY d.name, d.id LIMIT #{q.limit}",
+ "</script>"})
+ List<DmsFileCenterItemVO> selectSharedDocuments(@Param("q") DmsFileCenterQuery query);
+
+ @Select({"<script>", SHARED_ELIGIBLE_VERSIONS,
+ "SELECT", VERSION_COLUMNS,
+ "FROM public.dms_documents d",
+ "JOIN public.dms_file_versions v ON v.tenant_id = d.tenant_id AND v.document_id = d.id",
+ "JOIN public.dms_version_states s ON s.tenant_id = v.tenant_id",
+ "AND s.document_id = v.document_id AND s.file_version_id = v.id",
+ "JOIN eligible_versions allowed ON allowed.file_version_id = v.id",
+ "WHERE d.tenant_id = #{q.tenantId}",
+ "AND s.lifecycle_status IN ('SUPERSEDED', 'EXPIRED', 'REVOKED', 'INVALIDATED', 'OBSOLETE')",
+ "<if test='q.cursorName != null'>",
+ "AND (d.name > #{q.cursorName}",
+ "OR (d.name = #{q.cursorName} AND d.id > #{q.cursorDocumentId})",
+ "OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId}",
+ "AND v.version_no < #{q.cursorVersionNo})",
+ "OR (d.name = #{q.cursorName} AND d.id = #{q.cursorDocumentId}",
+ "AND v.version_no = #{q.cursorVersionNo} AND v.id < #{q.cursorId}))",
+ "</if>",
+ "<if test='!q.administrator'>",
+ "AND NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e WHERE", ACTIVE_EXCLUSION,
+ "AND ((e.resource_type = 'DOCUMENT' AND e.resource_id = d.id)",
+ "OR (e.resource_type = 'FILE_VERSION' AND e.resource_id = v.id)))",
+ "</if>",
+ "ORDER BY d.name, d.id, v.version_no DESC, v.id DESC LIMIT #{q.limit}",
+ "</script>"})
+ List<DmsFileCenterItemVO> selectSharedHistoricalVersions(@Param("q") DmsFileCenterQuery query);
+}
--
Gitblit v1.8.0