using Admin.NET.Core; namespace Admin.NET.Plugin.AiDOP.DataPlatform.MdpRebuild; /// 解析 AUTO/BOOTSTRAP 需要覆盖的租户/工厂作用域。 public sealed class MdpRebuildScopeCatalog : ITransient { private readonly ISqlSugarClient _db; public MdpRebuildScopeCatalog(ISqlSugarClient db) => _db = db; public async Task> ListEnabledScopesAsync(string moduleCode, CancellationToken ct = default) { var mc = MdpRebuildScope.NormalizeModule(moduleCode); 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 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(MdpRebuildScope.Create(mc, tenantId, factoryId)); } foreach (var id in tenants) Add(id, 1); try { var factSql = GetFactScopeSql(mc); if (factSql != null) { var fromFacts = await _db.Ado.SqlQueryAsync(factSql); foreach (var row in fromFacts) { if (enabledTenants.Contains(row.TenantId)) Add(row.TenantId, row.FactoryId <= 0 ? 1 : row.FactoryId); } } } catch { // 事实表尚未建立时仍按启用租户入队 } return list; } internal static string? GetFactScopeSql(string moduleCode) => moduleCode switch { "S1" => "SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId FROM mdp_std_so WHERE tenant_id > 0", "S2" => "SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId FROM mdp_std_work_order_schedule WHERE tenant_id > 0", "S3" => "SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId FROM mdp_std_delivery_schedule WHERE tenant_id > 0", "S4" => "SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId FROM dwd_s4_purchase_execution WHERE tenant_id > 0", _ => null }; private sealed class ScopeRow { public long TenantId { get; set; } public long FactoryId { get; set; } } }