S8MonitoringDataRequest.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
  2. /// <summary>
  3. /// 向 Provider 取数的请求上下文。
  4. ///
  5. /// 硬性设计约束:<see cref="TenantId"/> **必须由调用方显式传入**。
  6. /// Provider 实现禁止从 HttpContext / 当前登录用户 / 全局单租户假设推导作用域,
  7. /// 也禁止把租户写成 SQL 字面量 —— 这两种做法正是既有 LEGACY_SQL 规则里的已知问题形态。
  8. ///
  9. /// <para><b>S8-TENANT-ONLY-BATCH5:Factory 已退出取数作用域。</b>
  10. /// 它此前是必填项(<c>FactoryId &lt;= 0</c> 直接 <c>dataset_scope_invalid</c>),
  11. /// 但**没有任何 Provider 真的用它过滤** —— 唯一的 PURCHASE_DELIVERY Provider 的 WHERE
  12. /// 从一开始就只有 <c>tenant_id</c>。于是它是一道纯粹的形式门槛:
  13. /// 零工厂 / 多工厂租户会在这里被拒,而放行与否对取出的数据没有任何影响。
  14. /// 现在作用域只认 Tenant,与真实数据边界一致。</para>
  15. /// </summary>
  16. public sealed class S8MonitoringDataRequest
  17. {
  18. /// <summary>租户作用域。必填且必须 &gt; 0。</summary>
  19. public long TenantId { get; init; }
  20. /// <summary>数据集编码(STANDARD_DATASET 模式)。</summary>
  21. public string DatasetCode { get; init; } = string.Empty;
  22. /// <summary>触发本次取数的规则 Id(仅用于日志与排查)。</summary>
  23. public long RuleId { get; init; }
  24. /// <summary>触发本次取数的规则编码(仅用于日志与排查)。</summary>
  25. public string RuleCode { get; init; } = string.Empty;
  26. /// <summary>规则类型 TIMEOUT / SHORTAGE / OUT_OF_RANGE,供 Provider 做能力校验。</summary>
  27. public string RuleType { get; init; } = string.Empty;
  28. /// <summary>
  29. /// 作用域校验。缺失租户时显式失败,不允许 Provider 用默认值兜底
  30. /// (兜底会让跨租户读取以"看起来正常"的方式发生)。
  31. /// </summary>
  32. public void EnsureValid()
  33. {
  34. if (TenantId <= 0)
  35. throw new S8RuleEvaluatorException(
  36. "dataset_scope_invalid",
  37. $"数据集取数缺少有效 TenantId(rule={RuleCode}, dataset={DatasetCode})");
  38. }
  39. }