using Furion;
using SqlSugar;
namespace Admin.NET.Plugin.AiDOP.Infrastructure;
///
/// T8 源账套(ztid)→ AiDOP 目标租户(TenantId)映射解析器。
///
/// 背景:S5/S6/S7 的 KPI 由 T8 源库按账套 ztid 聚合产生,T8 行本身不含 DOP TenantId,
/// 因此 KPI 落库租户不能像 S1–S4 那样"从源行 tenant_id 推导",只能由"一账套 → 一租户"的显式映射注入。
/// 本类即该唯一映射来源,替代此前写死的 tenant_id = 1300000000001(禁止再作默认/兜底)。
///
/// 映射值来源【证据,非臆造默认】:T8 当前唯一账套 pbxfxp 对应的公司数据经 S1–S4 贴源落地后,
/// 全部业务主数据(crm_seorder / PurOrdRctMaster / NbrMaster / WorkOrdMaster …)均在 TenantId=797403760988229
/// (SysOrg.Name='AIDOP')名下,故 pbxfxp ↔ 797403760988229 与既有管线一致。
///
/// 映射唯一来源是 ado_source_domain_tenant_map(按 domain = 账套,status=1)。
/// 未登记或登记不唯一一律抛错,不回退固定租户,也不再读 appsettings。
///
public static class AidopSourceTenantMap
{
///
/// 解析一次刷新的目标租户。
/// 优先用显式 (>0);否则按 查归属表;
/// 查不到或不唯一即抛 。
///
public static long ResolveTenantId(string sourceZtid, long explicitTenantId = 0)
{
if (explicitTenantId > 0)
return explicitTenantId;
if (string.IsNullOrWhiteSpace(sourceZtid))
throw new InvalidOperationException("MDP 刷新缺少 SourceZtid,无法确定目标租户;不允许回退固定租户。");
var db = App.GetRequiredService();
var rows = db.Ado.SqlQuery(
"""
SELECT DISTINCT tenant_id
FROM ado_source_domain_tenant_map
WHERE domain = @Domain AND status = 1
""",
new List { new("@Domain", sourceZtid.Trim()) });
if (rows.Count == 0)
throw new InvalidOperationException(
$"未找到账套 domain='{sourceZtid}' 对应的 AiDOP 租户映射;请在 ado_source_domain_tenant_map 登记后再刷新(禁止回退固定租户)。");
if (rows.Count > 1)
throw new InvalidOperationException(
$"账套 domain='{sourceZtid}' 对应多个租户:{string.Join(",", rows)}。归属表必须唯一。");
return rows[0];
}
}