S8WatchRuleDataAccessValidator.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using Admin.NET.Plugin.AiDOP.Entity.S8;
  2. namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
  3. /// <summary>
  4. /// 规则取数配置校验(纯逻辑,不访问数据库)。
  5. ///
  6. /// S8-STANDARD-DATASET-HARD-CUTOVER-1:取数路径已唯一化为
  7. /// Dataset → Provider → Canonical,故本类不再有"模式分支"概念。
  8. /// 随之删除的:<c>RequiresDataSource</c>(物理数据源已不存在)、
  9. /// LEGACY_SQL 分支、expression 校验、data_access_mode 合法性校验。
  10. ///
  11. /// 仍然刻意分成两级,因为二者的时机与严格度不同:
  12. ///
  13. /// <b>ValidateForSave(保存 / 草稿)</b>——只看结构:dataset_code 填了且在目录里。
  14. /// **不查 Provider**,允许"数据集已定义、Provider 未上线"时先把规则配置好存下来。
  15. ///
  16. /// <b>ValidateForEnable(启用)</b>——委托 <see cref="S8DatasetEnableGate"/> 做完整运行条件校验,
  17. /// 含 Provider 注册、能力与字段齐备、作用域。
  18. /// </summary>
  19. public static class S8WatchRuleDataAccessValidator
  20. {
  21. /// <summary>
  22. /// 保存 / 草稿级校验:只校验结构与目录归属,不要求 Provider 已上线。
  23. /// 失败抛 <see cref="S8BizException"/>。
  24. /// </summary>
  25. public static void ValidateForSave(AdoS8WatchRule rule, IS8DatasetCatalog catalog)
  26. {
  27. // 编码必须填写且必须是目录中已定义的数据集(拦截编码写错),
  28. // 但**不检查 Provider 是否已注册** —— 那是启用期的事。
  29. if (string.IsNullOrWhiteSpace(rule.DatasetCode))
  30. throw new S8BizException($"[{S8DatasetReasonCode.CodeMissing}] 监控规则必须提供 dataset_code");
  31. if (!catalog.IsDefined(rule.DatasetCode))
  32. throw new S8BizException($"[{S8DatasetReasonCode.NotDefined}] 数据集 {rule.DatasetCode} 未在目录中定义");
  33. }
  34. /// <summary>
  35. /// 启用级校验:完整运行条件。失败抛 <see cref="S8BizException"/>,消息带 reason code。
  36. ///
  37. /// 这里是「Create 时带 enabled=true」与「UpdateParams 由停用切启用」两条路径的**共同必经点**。
  38. /// </summary>
  39. public static void ValidateForEnable(
  40. AdoS8WatchRule rule, S8DatasetEnableGate gate, long tenantId, long factoryId) =>
  41. gate.EnsureCanEnable(rule, tenantId, factoryId);
  42. }