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

diff --git a/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsPermissionMatcher.java b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsPermissionMatcher.java
new file mode 100644
index 0000000..648db23
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsPermissionMatcher.java
@@ -0,0 +1,53 @@
+package jnpf.dmsPermission;
+
+import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity;
+import jnpf.dmsEntity.permission.enums.DmsPrincipalType;
+import jnpf.dmsEntity.permission.enums.DmsResourceScope;
+import jnpf.dmsEntity.permission.enums.DmsResourceType;
+import jnpf.dmsEntity.permission.model.DmsResourcePath;
+import jnpf.dmsEntity.permission.model.DmsSubjectSet;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DmsPermissionMatcher {
+
+    public boolean matches(DmsFilePermissionEntity permission, DmsResourcePath path, DmsSubjectSet subjects) {
+        return matchesPrincipal(permission, subjects) && coversResource(permission, path);
+    }
+
+    public boolean matchesPrincipal(DmsFilePermissionEntity permission, DmsSubjectSet subjects) {
+        DmsPrincipalType type = DmsPrincipalType.valueOf(permission.getPrincipalType());
+        String id = permission.getPrincipalId();
+        switch (type) {
+            case USER:
+                return id.equals(subjects.getUserId());
+            case ORG:
+                return Boolean.TRUE.equals(permission.getIncludeChildOrgs())
+                        ? subjects.getAncestorOrgIds().contains(id)
+                        : subjects.getDirectOrgIds().contains(id);
+            case POSITION:
+                return subjects.getPositionIds().contains(id);
+            case ROLE:
+                return subjects.getRoleIds().contains(id);
+            case GROUP:
+                return subjects.getPermissionGroupIds().contains(id);
+            default:
+                return false;
+        }
+    }
+
+    public boolean coversResource(DmsFilePermissionEntity permission, DmsResourcePath path) {
+        DmsResourceType grantedType = DmsResourceType.valueOf(permission.getResourceType());
+        if (grantedType == DmsResourceType.FILE_VERSION) {
+            return DmsResourceType.FILE_VERSION.name().equals(path.getActualResourceType())
+                    && permission.getResourceId().equals(path.getActualResourceId());
+        }
+        if (grantedType == DmsResourceType.DOCUMENT) {
+            return permission.getResourceId().equals(path.getDocumentId());
+        }
+        if (DmsResourceScope.SUBTREE.name().equals(permission.getResourceScope())) {
+            return path.getFolderPath().contains(permission.getResourceId());
+        }
+        return permission.getResourceId().equals(path.getDirectFolderId());
+    }
+}

--
Gitblit v1.8.0