| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- using Admin.NET.Core.Service;
- using Microsoft.Extensions.Logging;
- namespace Admin.NET.Plugin.AiDOP.Service.S8;
- /// <summary>
- /// 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,不抛异常。
- /// </summary>
- public class S8RoleResolver : ITransient
- {
- private readonly SqlSugarRepository<SysRole> _sysRoleRep;
- private readonly SysUserRoleService _sysUserRoleService;
- private readonly ILogger<S8RoleResolver> _logger;
- public S8RoleResolver(
- SqlSugarRepository<SysRole> sysRoleRep,
- SysUserRoleService sysUserRoleService,
- ILogger<S8RoleResolver> logger)
- {
- _sysRoleRep = sysRoleRep;
- _sysUserRoleService = sysUserRoleService;
- _logger = logger;
- }
- /// <summary>
- /// 解析 RoleCode / RoleId 混合 token 列表为去重 UserId 列表。
- /// </summary>
- public async Task<List<long>> ResolveUserIdsAsync(IEnumerable<string>? roleTokens)
- {
- var result = new HashSet<long>();
- if (roleTokens == null) return result.ToList();
- var roleIds = new HashSet<long>();
- var codes = new HashSet<string>(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<string>(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();
- }
- /// <summary>
- /// 将 ado_s8_notification_layer.target_role_ids 这类 CSV 字段拆为 token 列表。
- /// 兼容 ',' 和 ';' 分隔,trim + 去空。
- /// </summary>
- public static List<string> SplitTokens(string? csv)
- {
- if (string.IsNullOrWhiteSpace(csv)) return new List<string>();
- return csv.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToList();
- }
- }
|