TeamMemberRoleHelper.cs 2.69 KB
using SqlSugar;
using Volo.Abp.Users;
using Yi.Framework.Rbac.Domain.Entities;

namespace FoodLabeling.Application.Helpers;

/// <summary>
/// Team Member 角色识别(Company Admin / Partner Admin 等)。
/// </summary>
public static class TeamMemberRoleHelper
{
    /// <summary>
    /// UI 展示为 Company Admin,库内常见为 Partner Admin 或 RoleCode 含 partner。
    /// </summary>
    public static bool IsCompanyAdminRoleName(string? roleName)
    {
        if (string.IsNullOrWhiteSpace(roleName))
        {
            return false;
        }

        var name = roleName.Trim();
        if (string.Equals(name, "Company Admin", StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }

        if (string.Equals(name, "Partner Admin", StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }

        return name.Contains("partner", StringComparison.OrdinalIgnoreCase) &&
               name.Contains("admin", StringComparison.OrdinalIgnoreCase);
    }

    /// <summary>
    /// 当前登录用户是否为 Company Admin 类角色。
    /// </summary>
    public static async Task<bool> IsCompanyAdminUserAsync(ISqlSugarClient db, ICurrentUser currentUser)
    {
        if (currentUser.Id is null)
        {
            return false;
        }

        var roleId = await db.Queryable<UserRoleEntity>()
            .Where(ur => ur.UserId == currentUser.Id.Value)
            .Select(ur => (Guid?)ur.RoleId)
            .FirstAsync();

        return await IsCompanyAdminRoleAsync(db, roleId);
    }

    /// <summary>
    /// 是否 Company Admin 类角色(按 RoleId 查库)。
    /// </summary>
    public static async Task<bool> IsCompanyAdminRoleAsync(ISqlSugarClient db, Guid? roleId)
    {
        if (roleId is null)
        {
            return false;
        }

        var role = await db.Queryable<RoleAggregateRoot>()
            .FirstAsync(x => !x.IsDeleted && x.Id == roleId.Value);
        if (role is null)
        {
            return false;
        }

        if (IsCompanyAdminRoleName(role.RoleName))
        {
            return true;
        }

        var code = role.RoleCode?.Trim();
        return !string.IsNullOrEmpty(code) &&
               code.Contains("partner", StringComparison.OrdinalIgnoreCase);
    }

    /// <summary>
    /// 列表/详情出参:Partner Admin → Company Admin(与 Web UI 一致)。
    /// </summary>
    public static string? FormatDisplayRoleName(string? roleName)
    {
        if (IsCompanyAdminRoleName(roleName) &&
            !string.Equals(roleName?.Trim(), "Company Admin", StringComparison.OrdinalIgnoreCase))
        {
            return "Company Admin";
        }

        return roleName;
    }
}