S8MonitorDictionaryService.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using Admin.NET.Plugin.AiDOP.Dto.S8;
  2. using Admin.NET.Plugin.AiDOP.Entity.S8;
  3. namespace Admin.NET.Plugin.AiDOP.Service.S8;
  4. /// <summary>
  5. /// S8 监控对象/指标只读字典服务。
  6. /// 合并策略:baseline (tenant_id=0/factory_id=0) + 当前 tenant/factory 覆盖;按 object_code/metric_code 去重。
  7. /// 仅返回 enabled=true 的对象与指标,且只返回有 enabled metric 的 object。
  8. /// </summary>
  9. public class S8MonitorDictionaryService : ITransient
  10. {
  11. private readonly SqlSugarRepository<AdoS8MonitorObject> _objectRep;
  12. private readonly SqlSugarRepository<AdoS8MonitorMetric> _metricRep;
  13. public S8MonitorDictionaryService(
  14. SqlSugarRepository<AdoS8MonitorObject> objectRep,
  15. SqlSugarRepository<AdoS8MonitorMetric> metricRep)
  16. {
  17. _objectRep = objectRep;
  18. _metricRep = metricRep;
  19. }
  20. public async Task<AdoS8MonitorOptionsResultDto> GetOptionsAsync(long tenantId)
  21. {
  22. var allObjects = await _objectRep.AsQueryable()
  23. .Where(x => x.TenantId == S8ConfigScope.GlobalTenantId || x.TenantId == tenantId)
  24. .ToListAsync();
  25. var allMetrics = await _metricRep.AsQueryable()
  26. .Where(x => x.TenantId == S8ConfigScope.GlobalTenantId || x.TenantId == tenantId)
  27. .ToListAsync();
  28. // tenant/factory 覆盖 baseline:同 object_code 优先取 tenant 行;同 metric_code 优先取 tenant 行。
  29. var resolvedObjects = allObjects
  30. .GroupBy(x => x.ObjectCode)
  31. .Select(g => g.OrderByDescending(x => x.TenantId != S8ConfigScope.GlobalTenantId).First())
  32. .Where(x => x.Enabled)
  33. .OrderBy(x => x.SortNo)
  34. .ThenBy(x => x.ObjectCode)
  35. .ToList();
  36. var resolvedMetrics = allMetrics
  37. .GroupBy(x => x.MetricCode)
  38. .Select(g => g.OrderByDescending(x => x.TenantId != S8ConfigScope.GlobalTenantId).First())
  39. .Where(x => x.Enabled)
  40. .OrderBy(x => x.SortNo)
  41. .ThenBy(x => x.MetricCode)
  42. .ToList();
  43. var result = new AdoS8MonitorOptionsResultDto();
  44. foreach (var obj in resolvedObjects)
  45. {
  46. var metrics = resolvedMetrics
  47. .Where(m => m.ObjectCode == obj.ObjectCode)
  48. .Select(m => new AdoS8MonitorMetricOptionDto
  49. {
  50. MetricCode = m.MetricCode,
  51. MetricLabel = m.MetricName,
  52. Mechanism = m.Mechanism,
  53. Unit = m.Unit,
  54. DueAtField = m.DueAtField,
  55. StatusField = m.StatusField,
  56. MeasuredValueField = m.MeasuredValueField,
  57. ObjectIdField = m.ObjectIdField,
  58. ObjectCodeField = m.ObjectCodeField,
  59. ObjectNameField = m.ObjectNameField,
  60. IsResultKpi = m.IsResultKpi,
  61. })
  62. .ToList();
  63. // 仅返回有 enabled metric 的 object
  64. if (metrics.Count == 0) continue;
  65. var mechanisms = metrics
  66. .Select(x => x.Mechanism)
  67. .Where(s => !string.IsNullOrWhiteSpace(s))
  68. .Distinct()
  69. .ToList();
  70. result.Objects.Add(new AdoS8MonitorObjectOptionDto
  71. {
  72. ObjectCode = obj.ObjectCode,
  73. ObjectType = obj.ObjectType,
  74. ObjectLabel = obj.ObjectName,
  75. SourceTable = obj.SourceTable,
  76. Mechanisms = mechanisms,
  77. Metrics = metrics,
  78. });
  79. }
  80. return result;
  81. }
  82. }