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