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/dmsPermission/DmsAccessExclusionResolver.java |   77 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 77 insertions(+), 0 deletions(-)

diff --git a/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsAccessExclusionResolver.java b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsAccessExclusionResolver.java
new file mode 100644
index 0000000..786f461
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsAccessExclusionResolver.java
@@ -0,0 +1,77 @@
+package jnpf.dmsPermission;
+
+import jnpf.dmsEntity.permission.entity.DmsAccessExclusionEntity;
+import jnpf.dmsEntity.permission.enums.DmsResourceType;
+import jnpf.dmsEntity.permission.model.DmsResourcePath;
+import jnpf.dmsMapper.DmsAccessExclusionMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+@Component
+@RequiredArgsConstructor
+public class DmsAccessExclusionResolver {
+    private final DmsAccessExclusionMapper exclusionMapper;
+
+    public Snapshot resolve(String tenantId, String userId, Collection<DmsResourcePath> paths) {
+        LinkedHashSet<UUID> resourceIds = new LinkedHashSet<>();
+        for (DmsResourcePath path : paths) {
+            if (path.getDocumentId() != null) {
+                resourceIds.add(path.getDocumentId());
+            }
+            if (DmsResourceType.FILE_VERSION.name().equals(path.getActualResourceType())) {
+                resourceIds.add(path.getActualResourceId());
+            }
+        }
+        if (resourceIds.isEmpty()) {
+            return Snapshot.empty();
+        }
+        List<DmsAccessExclusionEntity> rows = exclusionMapper.selectActiveForResourceIds(
+                tenantId, userId, new ArrayList<>(resourceIds));
+        Set<UUID> documentIds = new HashSet<>();
+        Set<UUID> versionIds = new HashSet<>();
+        for (DmsAccessExclusionEntity row : rows == null
+                ? Collections.<DmsAccessExclusionEntity>emptyList() : rows) {
+            if (DmsResourceType.DOCUMENT.name().equals(row.getResourceType())) {
+                documentIds.add(row.getResourceId());
+            } else if (DmsResourceType.FILE_VERSION.name().equals(row.getResourceType())) {
+                versionIds.add(row.getResourceId());
+            }
+        }
+        return new Snapshot(documentIds, versionIds);
+    }
+
+    public boolean isExcluded(String tenantId, String userId, DmsResourcePath path) {
+        return resolve(tenantId, userId, Collections.singletonList(path)).excludes(path);
+    }
+
+    public static final class Snapshot {
+        private final Set<UUID> documentIds;
+        private final Set<UUID> versionIds;
+
+        public Snapshot(Set<UUID> documentIds, Set<UUID> versionIds) {
+            this.documentIds = new HashSet<>(documentIds);
+            this.versionIds = new HashSet<>(versionIds);
+        }
+
+        public static Snapshot empty() {
+            return new Snapshot(Collections.<UUID>emptySet(), Collections.<UUID>emptySet());
+        }
+
+        public boolean excludes(DmsResourcePath path) {
+            if (DmsResourceType.FILE_VERSION.name().equals(path.getActualResourceType())
+                    && versionIds.contains(path.getActualResourceId())) {
+                return true;
+            }
+            return path.getDocumentId() != null && documentIds.contains(path.getDocumentId());
+        }
+    }
+}

--
Gitblit v1.8.0