MdpRebuildScopeCatalog.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Admin.NET.Core;
  2. namespace Admin.NET.Plugin.AiDOP.DataPlatform.MdpRebuild;
  3. /// <summary>解析 AUTO/BOOTSTRAP 需要覆盖的租户/工厂作用域。</summary>
  4. public sealed class MdpRebuildScopeCatalog : ITransient
  5. {
  6. private readonly ISqlSugarClient _db;
  7. public MdpRebuildScopeCatalog(ISqlSugarClient db) => _db = db;
  8. public async Task<IReadOnlyList<MdpRebuildScope>> ListEnabledScopesAsync(string moduleCode, CancellationToken ct = default)
  9. {
  10. var mc = MdpRebuildScope.NormalizeModule(moduleCode);
  11. var tenants = await _db.Queryable<SysTenant>()
  12. .Where(x => x.Status == StatusEnum.Enable && x.Id != SqlSugarConst.DefaultTenantId)
  13. .Select(x => x.Id)
  14. .ToListAsync(ct);
  15. var enabledTenants = tenants.ToHashSet();
  16. var set = new HashSet<string>(StringComparer.Ordinal);
  17. var list = new List<MdpRebuildScope>();
  18. void Add(long tenantId, long factoryId)
  19. {
  20. if (tenantId <= 0 || factoryId <= 0 || factoryId == tenantId) return;
  21. var key = $"{tenantId}:{factoryId}";
  22. if (!set.Add(key)) return;
  23. list.Add(MdpRebuildScope.Create(mc, tenantId, factoryId));
  24. }
  25. foreach (var id in tenants)
  26. Add(id, 1);
  27. try
  28. {
  29. var factSql = GetFactScopeSql(mc);
  30. if (factSql != null)
  31. {
  32. var fromFacts = await _db.Ado.SqlQueryAsync<ScopeRow>(factSql);
  33. foreach (var row in fromFacts)
  34. {
  35. if (enabledTenants.Contains(row.TenantId))
  36. Add(row.TenantId, row.FactoryId <= 0 ? 1 : row.FactoryId);
  37. }
  38. }
  39. }
  40. catch
  41. {
  42. // 事实表尚未建立时仍按启用租户入队
  43. }
  44. return list;
  45. }
  46. internal static string? GetFactScopeSql(string moduleCode) => moduleCode switch
  47. {
  48. "S1" => "SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId FROM mdp_std_so WHERE tenant_id > 0",
  49. "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",
  50. "S3" => "SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId FROM mdp_std_delivery_schedule WHERE tenant_id > 0",
  51. "S4" => "SELECT DISTINCT tenant_id AS TenantId, COALESCE(NULLIF(factory_id, 0), 1) AS FactoryId FROM dwd_s4_purchase_execution WHERE tenant_id > 0",
  52. _ => null
  53. };
  54. private sealed class ScopeRow
  55. {
  56. public long TenantId { get; set; }
  57. public long FactoryId { get; set; }
  58. }
  59. }