using Furion; using Microsoft.Extensions.Configuration; 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 与既有管线一致。 /// /// 可覆盖:appsettings 段 AidopMdp:ZtidTenantMap(形如 { "pbxfxp": "797403760988229" })优先于内置映射。 /// 未映射的 ztid 一律抛错,绝不回退到任何固定租户。 /// public static class AidopSourceTenantMap { /// 内置映射(部署可用 appsettings AidopMdp:ZtidTenantMap 覆盖)。 private static readonly IReadOnlyDictionary BuiltInMap = new Dictionary(StringComparer.OrdinalIgnoreCase) { // pbxfxp = T8 当前唯一账套;对应 DOP 业务数据租户 797403760988229(SysOrg.Name='AIDOP') ["pbxfxp"] = 797403760988229L, }; /// /// 解析一次刷新的目标租户。 /// 优先用显式 (>0);否则按 查映射; /// 查不到即抛 ,不回退固定租户。 /// public static long ResolveTenantId(string sourceZtid, long explicitTenantId = 0) { if (explicitTenantId > 0) return explicitTenantId; if (string.IsNullOrWhiteSpace(sourceZtid)) throw new InvalidOperationException("MDP 刷新缺少 SourceZtid,无法确定目标租户;不允许回退固定租户。"); // appsettings 覆盖优先 var overridden = App.GetConfig>("AidopMdp:ZtidTenantMap", true); if (overridden != null) { foreach (var kv in overridden) { if (string.Equals(kv.Key, sourceZtid, StringComparison.OrdinalIgnoreCase) && long.TryParse(kv.Value, out var cfgTid) && cfgTid > 0) return cfgTid; } } if (BuiltInMap.TryGetValue(sourceZtid, out var tid)) return tid; throw new InvalidOperationException( $"未找到 T8 账套 ztid='{sourceZtid}' 对应的 AiDOP 租户映射;请在 appsettings 段 AidopMdp:ZtidTenantMap 配置后再刷新(禁止回退固定租户)。"); } }