AidopSourceTenantMap.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Furion;
  2. using Microsoft.Extensions.Configuration;
  3. namespace Admin.NET.Plugin.AiDOP.Infrastructure;
  4. /// <summary>
  5. /// T8 源账套(ztid)→ AiDOP 目标租户(TenantId)映射解析器。
  6. ///
  7. /// 背景:S5/S6/S7 的 KPI 由 T8 源库按账套 <c>ztid</c> 聚合产生,T8 行本身不含 DOP TenantId,
  8. /// 因此 KPI 落库租户不能像 S1–S4 那样"从源行 tenant_id 推导",只能由"一账套 → 一租户"的显式映射注入。
  9. /// 本类即该唯一映射来源,替代此前写死的 <c>tenant_id = 1300000000001</c>(禁止再作默认/兜底)。
  10. ///
  11. /// 映射值来源【证据,非臆造默认】:T8 当前唯一账套 <c>pbxfxp</c> 对应的公司数据经 S1–S4 贴源落地后,
  12. /// 全部业务主数据(crm_seorder / PurOrdRctMaster / NbrMaster / WorkOrdMaster …)均在 TenantId=797403760988229
  13. /// (SysOrg.Name='AIDOP')名下,故 pbxfxp ↔ 797403760988229 与既有管线一致。
  14. ///
  15. /// 可覆盖:appsettings 段 <c>AidopMdp:ZtidTenantMap</c>(形如 { "pbxfxp": "797403760988229" })优先于内置映射。
  16. /// 未映射的 ztid 一律抛错,绝不回退到任何固定租户。
  17. /// </summary>
  18. public static class AidopSourceTenantMap
  19. {
  20. /// <summary>内置映射(部署可用 appsettings AidopMdp:ZtidTenantMap 覆盖)。</summary>
  21. private static readonly IReadOnlyDictionary<string, long> BuiltInMap = new Dictionary<string, long>(StringComparer.OrdinalIgnoreCase)
  22. {
  23. // pbxfxp = T8 当前唯一账套;对应 DOP 业务数据租户 797403760988229(SysOrg.Name='AIDOP')
  24. ["pbxfxp"] = 797403760988229L,
  25. };
  26. /// <summary>
  27. /// 解析一次刷新的目标租户。
  28. /// 优先用显式 <paramref name="explicitTenantId"/>(&gt;0);否则按 <paramref name="sourceZtid"/> 查映射;
  29. /// 查不到即抛 <see cref="InvalidOperationException"/>,不回退固定租户。
  30. /// </summary>
  31. public static long ResolveTenantId(string sourceZtid, long explicitTenantId = 0)
  32. {
  33. if (explicitTenantId > 0)
  34. return explicitTenantId;
  35. if (string.IsNullOrWhiteSpace(sourceZtid))
  36. throw new InvalidOperationException("MDP 刷新缺少 SourceZtid,无法确定目标租户;不允许回退固定租户。");
  37. // appsettings 覆盖优先
  38. var overridden = App.GetConfig<Dictionary<string, string>>("AidopMdp:ZtidTenantMap", true);
  39. if (overridden != null)
  40. {
  41. foreach (var kv in overridden)
  42. {
  43. if (string.Equals(kv.Key, sourceZtid, StringComparison.OrdinalIgnoreCase)
  44. && long.TryParse(kv.Value, out var cfgTid) && cfgTid > 0)
  45. return cfgTid;
  46. }
  47. }
  48. if (BuiltInMap.TryGetValue(sourceZtid, out var tid))
  49. return tid;
  50. throw new InvalidOperationException(
  51. $"未找到 T8 账套 ztid='{sourceZtid}' 对应的 AiDOP 租户映射;请在 appsettings 段 AidopMdp:ZtidTenantMap 配置后再刷新(禁止回退固定租户)。");
  52. }
  53. }