| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- using Admin.NET.Core;
- namespace Admin.NET.Plugin.AiDOP.DataPlatform.MdpRebuild;
- /// <summary>解析 AUTO/BOOTSTRAP 需要覆盖的租户/工厂作用域。</summary>
- public sealed class MdpRebuildScopeCatalog : ITransient
- {
- private readonly ISqlSugarClient _db;
- public MdpRebuildScopeCatalog(ISqlSugarClient db) => _db = db;
- public async Task<IReadOnlyList<MdpRebuildScope>> ListEnabledScopesAsync(string moduleCode, CancellationToken ct = default)
- {
- var mc = MdpRebuildScope.NormalizeModule(moduleCode);
- var tenants = await _db.Queryable<SysTenant>()
- .Where(x => x.Status == StatusEnum.Enable && x.Id != SqlSugarConst.DefaultTenantId)
- .Select(x => x.Id)
- .ToListAsync(ct);
- var enabledTenants = tenants.ToHashSet();
- var set = new HashSet<string>(StringComparer.Ordinal);
- var list = new List<MdpRebuildScope>();
- 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<ScopeRow>(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; }
- }
- }
|