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