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; }
}
}