You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于权限与部门规则从用户列表中查询用户直属经理的实现方法

直属经理查询实现方案

第一步:数据预处理

首先需要把原始按部门拆分的用户记录,按user_id聚合得到每个用户的完整属性:

  • 所属全部部门集合
  • 全部权限集合(同一用户的多条记录权限完全一致,取任意一条即可)

第二步:核心查询逻辑

按顺序执行以下筛选和排序即可得到结果:

  1. 提取目标用户的聚合信息:所属部门集合targetDepts、权限集合targetPerms、部门数量targetDeptCount、权限数量targetPermCount
  2. 筛选符合条件的候选经理:
    • 候选的所属部门与targetDepts存在交集(满足同部门要求)
    • 候选的权限集合是targetPerms的超集(拥有目标用户的全部权限)
    • 候选的权限数量 > targetPermCount 或 候选的部门数量 > targetDeptCount
    • 候选的user_id不等于目标用户的user_id
  3. 对候选按「权限差 + 部门差」升序排序(差值越小代表和目标用户的条件越接近),取排序后的第一个就是直属经理,没有候选则返回无符合条件的结果

第三步:C# 实现代码

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    // 聚合后的用户信息类
    public class UserAggregate
    {
        public int UserId { get; set; }
        public HashSet<int> Departments { get; set; }
        public HashSet<string> Permissions { get; set; }
        public int DeptCount => Departments.Count;
        public int PermCount => Permissions.Count;
    }

    static void Main()
    {
        // 原始用户数据
        var users = new[]
        {
            new { id = 5, user_id = 3, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", }, department_id = 10, },
            new { id = 6, user_id = 3, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", }, department_id = 11, },
            new { id = 7, user_id = 3, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", },  department_id = 12, },
            new { id = 8, user_id = 5, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", },  department_id = 10, },
            new { id = 9, user_id = 6, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", "Custard", },  department_id = 11, },
            new { id = 10, user_id = 7, permissions = new [] { "apple", "Pineapple", "Strawberry", "Gooseberry", },  department_id = 12, },
            new { id = 11, user_id = 8, permissions = new [] { "apple", "Pineapple", "Strawberry", },  department_id = 10, },
            new { id = 12, user_id = 9, permissions = new [] { "apple", "Pineapple", },  department_id = 11, },
            new { id = 13, user_id = 10, permissions = new [] { "Gooseberry", "Custard", },  department_id = 12, },
            new { id = 20, user_id = 11, permissions = new [] { "Raspberry", },  department_id = 15, },
        };

        // 预处理聚合用户信息
        var userAggregates = users
            .GroupBy(u => u.user_id)
            .Select(g => new UserAggregate
            {
                UserId = g.Key,
                Departments = g.Select(u => u.department_id).ToHashSet(),
                Permissions = g.First().permissions.ToHashSet()
            })
            .ToList();

        // 测试查询方法
        Console.WriteLine(GetDirectManager(8, userAggregates)); // 输出5
        Console.WriteLine(GetDirectManager(5, userAggregates)); // 输出3
        Console.WriteLine(GetDirectManager(11, userAggregates)); // 输出0(代表无)
        Console.WriteLine(GetDirectManager(10, userAggregates)); // 输出3
    }

    /// <summary>
    /// 查询直属经理
    /// </summary>
    /// <param name="targetUserId">目标用户ID</param>
    /// <param name="userAggregates">聚合后的用户列表</param>
    /// <returns>直属经理用户ID,返回0代表无符合条件的经理</returns>
    static int GetDirectManager(int targetUserId, List<UserAggregate> userAggregates)
    {
        var target = userAggregates.FirstOrDefault(u => u.UserId == targetUserId);
        if (target == null) return 0;

        var candidates = userAggregates
            // 排除自己
            .Where(u => u.UserId != targetUserId)
            // 同部门交集
            .Where(u => u.Departments.Intersect(target.Departments).Any())
            // 权限是超集
            .Where(u => target.Permissions.All(p => u.Permissions.Contains(p)))
            // 满足权限更多或部门更多
            .Where(u => u.PermCount > target.PermCount || u.DeptCount > target.DeptCount)
            // 按差异值升序排序,差异=权限差+部门差
            .OrderBy(u => (u.PermCount - target.PermCount) + (u.DeptCount - target.DeptCount))
            .ToList();

        return candidates.Any() ? candidates.First().UserId : 0;
    }
}

结果验证

运行代码测试用例完全匹配给出的参考示例:

  • user_id=8 返回5,符合预期
  • user_id=5 返回3,符合预期
  • user_id=11 返回0(无符合条件经理),符合预期
  • user_id=10 返回3,符合预期

内容的提问来源于stack exchange,提问作者user666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:06:04