using Admin.NET.Core;
namespace Admin.NET.Plugin.AiDOP.DataPlatform.S1Refresh;
/// 解析 AUTO/BOOTSTRAP 需要覆盖的租户/工厂作用域。
public sealed class S1MdpScopeCatalog : ITransient
{
private readonly ISqlSugarClient _db;
public S1MdpScopeCatalog(ISqlSugarClient db) => _db = db;
public async Task> ListEnabledScopesAsync(CancellationToken ct = default)
{
var tenants = await _db.Queryable()
.Where(x => x.Status == StatusEnum.Enable && x.Id != SqlSugarConst.DefaultTenantId)
.Select(x => x.Id)
.ToListAsync(ct);
var enabledTenants = tenants.ToHashSet();
var fromFacts = await _db.Ado.SqlQueryAsync(
"""
SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId
FROM mdp_std_so
WHERE tenant_id > 0
""");
var set = new HashSet(StringComparer.Ordinal);
var list = new List();
void Add(long tenantId, long factoryId)
{
if (tenantId <= 0 || factoryId <= 0 || factoryId == tenantId) return;
var key = $"{tenantId}:{factoryId}";
if (!set.Add(key)) return;
list.Add(S1MdpRunScope.Create(tenantId, factoryId));
}
foreach (var id in tenants)
Add(id, 1);
foreach (var row in fromFacts)
{
if (enabledTenants.Contains(row.TenantId))
Add(row.TenantId, row.FactoryId <= 0 ? 1 : row.FactoryId);
}
return list;
}
}