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

diff --git a/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsPermissionGroupMembershipResolver.java b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsPermissionGroupMembershipResolver.java
new file mode 100644
index 0000000..e971677
--- /dev/null
+++ b/jnpf-dms/jnpf-dms-biz/src/main/java/jnpf/dmsPermission/DmsPermissionGroupMembershipResolver.java
@@ -0,0 +1,101 @@
+package jnpf.dmsPermission;
+
+import jnpf.dmsEntity.permission.model.DmsSubjectSet;
+import jnpf.dmsMapper.DmsPermissionGroupMapper;
+import jnpf.permission.entity.PermissionGroupEntity;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Component
+@RequiredArgsConstructor
+public class DmsPermissionGroupMembershipResolver {
+    private final DmsPermissionGroupMapper permissionGroupMapper;
+
+    public void resolve(Collection<String> candidateIds, DmsSubjectSet subjects) {
+        if (candidateIds == null || candidateIds.isEmpty()) {
+            return;
+        }
+        List<PermissionGroupEntity> groups = permissionGroupMapper.selectEnabledByIds(candidateIds);
+        if (groups == null) {
+            return;
+        }
+        apply(groups, candidateIds, subjects);
+    }
+
+    public void resolveAll(DmsSubjectSet subjects, int maxGroups) {
+        List<PermissionGroupEntity> groups = permissionGroupMapper.selectEnabled(maxGroups + 1);
+        if (groups != null && groups.size() > maxGroups) {
+            throw DmsPermissionException.of(DmsPermissionError.INVALID_REQUEST,
+                    "鍚敤鐨勬潈闄愮粍瓒呰繃鏂囦欢涓績鍗曟瑙f瀽涓婇檺 " + maxGroups);
+        }
+        Set<String> ids = new HashSet<>();
+        if (groups != null) {
+            for (PermissionGroupEntity group : groups) {
+                if (group != null && group.getId() != null) {
+                    ids.add(group.getId());
+                }
+            }
+        }
+        apply(groups, ids, subjects);
+    }
+
+    private void apply(List<PermissionGroupEntity> groups, Collection<String> candidateIds,
+                       DmsSubjectSet subjects) {
+        if (groups == null || candidateIds == null || candidateIds.isEmpty()) {
+            return;
+        }
+        Set<String> memberTokens = buildMemberTokens(subjects);
+        for (PermissionGroupEntity group : groups) {
+            if (group == null || group.getId() == null || !candidateIds.contains(group.getId())) {
+                continue;
+            }
+            if (Integer.valueOf(0).equals(group.getType()) || containsMember(group.getPermissionMember(), memberTokens)) {
+                subjects.getPermissionGroupIds().add(group.getId());
+            }
+        }
+    }
+
+    private boolean containsMember(String members, Set<String> subjectTokens) {
+        if (members == null || members.trim().isEmpty()) {
+            return false;
+        }
+        String[] tokens = members.split(",");
+        for (String token : tokens) {
+            if (subjectTokens.contains(token.trim())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private Set<String> buildMemberTokens(DmsSubjectSet subjects) {
+        Set<String> tokens = new HashSet<>();
+        add(tokens, subjects.getUserId(), "user");
+        addAll(tokens, subjects.getDirectOrgIds(), "organize", "org", "subOrg");
+        addAll(tokens, subjects.getAncestorOrgIds(), "organize", "org", "progenyOrg");
+        addAll(tokens, subjects.getPositionIds(), "position", "pos", "subPos", "progenyPos");
+        addAll(tokens, subjects.getRoleIds(), "role");
+        addAll(tokens, subjects.getPlatformGroupIds(), "group");
+        return tokens;
+    }
+
+    private void addAll(Set<String> tokens, Collection<String> ids, String... types) {
+        for (String id : ids) {
+            for (String type : types) {
+                add(tokens, id, type);
+            }
+        }
+    }
+
+    private void add(Set<String> tokens, String id, String type) {
+        if (id != null && !id.trim().isEmpty()) {
+            tokens.add(id.trim());
+            tokens.add(id.trim() + "--" + type);
+        }
+    }
+}

--
Gitblit v1.8.0