S8DatasetDiagnosticsService.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
  2. /// <summary>
  3. /// 数据集可用性诊断项。回答"这个数据集当前能不能用、能用于哪类规则",
  4. /// 不预览任何业务数据。
  5. /// </summary>
  6. public sealed class S8DatasetDiagnosticDto
  7. {
  8. public string DatasetCode { get; init; } = string.Empty;
  9. public string DisplayName { get; init; } = string.Empty;
  10. public string Kind { get; init; } = string.Empty;
  11. public string? Description { get; init; }
  12. /// <summary>声明状态:DEFINED / DISABLED。</summary>
  13. public string DeclaredStatus { get; init; } = string.Empty;
  14. /// <summary>有效状态:READY / PROVIDER_MISSING / DISABLED。</summary>
  15. public string EffectiveStatus { get; init; } = string.Empty;
  16. public bool ProviderRegistered { get; init; }
  17. public string? ProviderType { get; init; }
  18. /// <summary>目录声明支持的规则类型(仅机制层)。</summary>
  19. public IReadOnlyList<string> DeclaredRuleTypes { get; init; } = Array.Empty<string>();
  20. /// <summary>真正可用的规则类型:机制支持 + canonical 字段齐备 + Provider 已注册且能力一致。</summary>
  21. public IReadOnlyList<string> UsableRuleTypes { get; init; } = Array.Empty<string>();
  22. /// <summary>各规则类型缺失的 canonical 字段,供配置界面提示。</summary>
  23. public IReadOnlyDictionary<string, IReadOnlyList<string>> MissingFieldsByRuleType { get; init; }
  24. = new Dictionary<string, IReadOnlyList<string>>();
  25. }
  26. /// <summary>
  27. /// 数据集诊断服务。为后续规则配置界面提供"哪些数据集当前可用于哪类规则"的依据,
  28. /// 使配置方不必先建规则再靠报错试探。
  29. /// </summary>
  30. public class S8DatasetDiagnosticsService : ITransient
  31. {
  32. private readonly IS8DatasetCatalog _catalog;
  33. private readonly S8MonitoringDataProviderRegistry _registry;
  34. public S8DatasetDiagnosticsService(IS8DatasetCatalog catalog, S8MonitoringDataProviderRegistry registry)
  35. {
  36. _catalog = catalog;
  37. _registry = registry;
  38. }
  39. /// <summary>列出全部已定义数据集(含尚无 Provider 的)。</summary>
  40. public IReadOnlyList<S8DatasetDiagnosticDto> List() =>
  41. _catalog.All.Select(Describe).OrderBy(x => x.DatasetCode, StringComparer.OrdinalIgnoreCase).ToList();
  42. /// <summary>描述单个数据集;未定义返回 null(与"已定义但无 Provider"区分)。</summary>
  43. public S8DatasetDiagnosticDto? Describe(string? datasetCode)
  44. {
  45. var definition = _catalog.Find(datasetCode);
  46. return definition == null ? null : Describe(definition);
  47. }
  48. private S8DatasetDiagnosticDto Describe(S8DatasetDefinition definition)
  49. {
  50. var registered = _registry.IsRegistered(definition.DatasetCode);
  51. var provider = registered ? _registry.Resolve(definition.DatasetCode) : null;
  52. var effectiveStatus = !definition.IsActive
  53. ? S8DatasetStatus.Disabled
  54. : registered
  55. ? S8DatasetStatus.Ready
  56. : S8DatasetStatus.ProviderMissing;
  57. var declared = S8RuleTypeFieldRequirements.KnownRuleTypes
  58. .Where(rt => definition.Capabilities.Supports(rt))
  59. .ToList();
  60. // 可用 = 目录能力齐备 && (若已注册)Provider 能力也齐备。
  61. var usable = declared
  62. .Where(rt => definition.Capabilities.CanServe(rt))
  63. .Where(rt => provider == null || provider.Capabilities.CanServe(rt))
  64. .ToList();
  65. var missing = new Dictionary<string, IReadOnlyList<string>>(StringComparer.OrdinalIgnoreCase);
  66. foreach (var ruleType in declared)
  67. {
  68. var gaps = definition.Capabilities.MissingFieldsFor(ruleType);
  69. if (gaps is { Count: > 0 }) missing[ruleType] = gaps;
  70. }
  71. return new S8DatasetDiagnosticDto
  72. {
  73. DatasetCode = definition.DatasetCode,
  74. DisplayName = definition.DisplayName,
  75. Kind = definition.Kind,
  76. Description = definition.Description,
  77. DeclaredStatus = definition.Status,
  78. EffectiveStatus = effectiveStatus,
  79. ProviderRegistered = registered,
  80. ProviderType = provider?.GetType().Name,
  81. DeclaredRuleTypes = declared,
  82. UsableRuleTypes = usable,
  83. MissingFieldsByRuleType = missing
  84. };
  85. }
  86. }