using Admin.NET.Core.Service;
using Microsoft.Extensions.Logging;
namespace Admin.NET.Plugin.AiDOP.Service.S8;
///
/// S8 本地 Role → UserIds 解析器。
/// 不改 Admin.NET.Core;不新增 SysUserRoleService.GetUserIdListByRoleCode。
/// 在 S8 侧自行完成 RoleCode → SysRole.Id → UserIds 的解析。
///
/// 兼容策略(与 ado_s8_notification_layer.target_role_ids 现状一致:表当前 0 行,
/// SeedData 同时存在 RoleCode 命名(ROLE_ORDER_PLANNER)和 SysRole.Code 实存值(S8_01)):
/// - 纯数字 token → 视为 SysRole.Id
/// - 非数字 token → 视为 SysRole.Code
/// - 找不到的 token:仅 LogWarning,不抛异常。
///
public class S8RoleResolver : ITransient
{
private readonly SqlSugarRepository _sysRoleRep;
private readonly SysUserRoleService _sysUserRoleService;
private readonly ILogger _logger;
public S8RoleResolver(
SqlSugarRepository sysRoleRep,
SysUserRoleService sysUserRoleService,
ILogger logger)
{
_sysRoleRep = sysRoleRep;
_sysUserRoleService = sysUserRoleService;
_logger = logger;
}
///
/// 解析 RoleCode / RoleId 混合 token 列表为去重 UserId 列表。
///
public async Task> ResolveUserIdsAsync(IEnumerable? roleTokens)
{
var result = new HashSet();
if (roleTokens == null) return result.ToList();
var roleIds = new HashSet();
var codes = new HashSet(StringComparer.OrdinalIgnoreCase);
foreach (var raw in roleTokens)
{
if (string.IsNullOrWhiteSpace(raw)) continue;
var t = raw.Trim();
if (long.TryParse(t, out var rid) && rid > 0) roleIds.Add(rid);
else codes.Add(t);
}
if (codes.Count > 0)
{
try
{
var codeList = codes.ToList();
var found = await _sysRoleRep.AsQueryable()
.Where(r => codeList.Contains(r.Code))
.Select(r => new { r.Id, r.Code })
.ToListAsync();
var foundCodes = new HashSet(found.Select(f => f.Code ?? string.Empty), StringComparer.OrdinalIgnoreCase);
foreach (var c in codes)
{
if (!foundCodes.Contains(c))
_logger.LogWarning("S8RoleResolver: RoleCode '{Code}' not found in SysRole", c);
}
foreach (var f in found) roleIds.Add(f.Id);
}
catch (Exception ex)
{
_logger.LogWarning(ex, "S8RoleResolver: resolve RoleCode batch failed");
}
}
foreach (var rid in roleIds)
{
try
{
var ids = await _sysUserRoleService.GetUserIdList(rid);
foreach (var uid in ids)
if (uid > 0) result.Add(uid);
}
catch (Exception ex)
{
_logger.LogWarning(ex, "S8RoleResolver: GetUserIdList(roleId={RoleId}) failed", rid);
}
}
return result.ToList();
}
///
/// 将 ado_s8_notification_layer.target_role_ids 这类 CSV 字段拆为 token 列表。
/// 兼容 ',' 和 ';' 分隔,trim + 去空。
///
public static List SplitTokens(string? csv)
{
if (string.IsNullOrWhiteSpace(csv)) return new List();
return csv.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToList();
}
}