using Fake.DependencyInjection;
using Fake.Rbac.Infrastructure;
using Microsoft.EntityFrameworkCore;
namespace Oms.Application.Shared;
///
/// 将 OMS 审计字段中的 RBAC mapId(user.userid)解析为展示名称。
///
public class OmsRbacUserDisplayNameResolver : IScopedDependency
{
private readonly FakeRbacDbContext _rbacDbContext;
public OmsRbacUserDisplayNameResolver(FakeRbacDbContext rbacDbContext)
{
_rbacDbContext = rbacDbContext;
}
public async Task ResolveAsync(int userId, CancellationToken cancellationToken = default)
{
if (userId <= 0)
{
return null;
}
var map = await ResolveManyAsync([userId], cancellationToken);
return FormatUserId(userId, map);
}
public async Task> ResolveManyAsync(
IEnumerable userIds,
CancellationToken cancellationToken = default)
{
var ids = userIds.Where(x => x > 0).Distinct().ToList();
if (ids.Count == 0)
{
return new Dictionary();
}
try
{
var sql =
$"SELECT `userid` AS `{nameof(RbacUserNameRow.UserId)}`, `Name` AS `{nameof(RbacUserNameRow.DisplayName)}` FROM `user` WHERE `IsDeleted` = 0 AND `userid` IN ({string.Join(",", ids)})";
var rows = await _rbacDbContext.Database
.SqlQueryRaw(sql)
.ToListAsync(cancellationToken);
return rows.ToDictionary(
x => x.UserId,
x => NormalizeDisplayName(x.DisplayName, x.UserId));
}
catch
{
return ids.ToDictionary(x => x, x => x.ToString());
}
}
public static string? FormatUserId(int userId, IReadOnlyDictionary? nameMap)
{
if (userId <= 0)
{
return null;
}
if (nameMap != null &&
nameMap.TryGetValue(userId, out var name) &&
!string.IsNullOrWhiteSpace(name))
{
return name;
}
return userId.ToString();
}
private static string NormalizeDisplayName(string? name, int userId)
{
var trimmed = name?.Trim();
return string.IsNullOrWhiteSpace(trimmed) ? userId.ToString() : trimmed;
}
private sealed class RbacUserNameRow
{
public int UserId { get; set; }
public string? DisplayName { get; set; }
}
}