S1MdpScopeCatalog.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Admin.NET.Core;
  2. namespace Admin.NET.Plugin.AiDOP.DataPlatform.S1Refresh;
  3. /// <summary>解析 AUTO/BOOTSTRAP 需要覆盖的租户/工厂作用域。</summary>
  4. public sealed class S1MdpScopeCatalog : ITransient
  5. {
  6. private readonly ISqlSugarClient _db;
  7. public S1MdpScopeCatalog(ISqlSugarClient db) => _db = db;
  8. public async Task<IReadOnlyList<S1MdpRunScope>> ListEnabledScopesAsync(CancellationToken ct = default)
  9. {
  10. var tenants = await _db.Queryable<SysTenant>()
  11. .Where(x => x.Status == StatusEnum.Enable && x.Id != SqlSugarConst.DefaultTenantId)
  12. .Select(x => x.Id)
  13. .ToListAsync(ct);
  14. var enabledTenants = tenants.ToHashSet();
  15. var fromFacts = await _db.Ado.SqlQueryAsync<S1MdpScopeRow>(
  16. """
  17. SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId
  18. FROM mdp_std_so
  19. WHERE tenant_id > 0
  20. """);
  21. var set = new HashSet<string>(StringComparer.Ordinal);
  22. var list = new List<S1MdpRunScope>();
  23. void Add(long tenantId, long factoryId)
  24. {
  25. if (tenantId <= 0 || factoryId <= 0 || factoryId == tenantId) return;
  26. var key = $"{tenantId}:{factoryId}";
  27. if (!set.Add(key)) return;
  28. list.Add(S1MdpRunScope.Create(tenantId, factoryId));
  29. }
  30. foreach (var id in tenants)
  31. Add(id, 1);
  32. foreach (var row in fromFacts)
  33. {
  34. if (enabledTenants.Contains(row.TenantId))
  35. Add(row.TenantId, row.FactoryId <= 0 ? 1 : row.FactoryId);
  36. }
  37. return list;
  38. }
  39. }