S8MonitorDictionaryService.cs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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, long factoryId)
  21. {
  22. var allObjects = await _objectRep.AsQueryable()
  23. .Where(x => (x.TenantId == 0 && x.FactoryId == 0)
  24. || (x.TenantId == tenantId && x.FactoryId == factoryId))
  25. .ToListAsync();
  26. var allMetrics = await _metricRep.AsQueryable()
  27. .Where(x => (x.TenantId == 0 && x.FactoryId == 0)
  28. || (x.TenantId == tenantId && x.FactoryId == factoryId))
  29. .ToListAsync();
  30. // tenant/factory 覆盖 baseline:同 object_code 优先取 tenant 行;同 metric_code 优先取 tenant 行。
  31. var resolvedObjects = allObjects
  32. .GroupBy(x => x.ObjectCode)
  33. .Select(g => g.OrderByDescending(x => x.FactoryId).ThenByDescending(x => x.TenantId).First())
  34. .Where(x => x.Enabled)
  35. .OrderBy(x => x.SortNo)
  36. .ThenBy(x => x.ObjectCode)
  37. .ToList();
  38. var resolvedMetrics = allMetrics
  39. .GroupBy(x => x.MetricCode)
  40. .Select(g => g.OrderByDescending(x => x.FactoryId).ThenByDescending(x => x.TenantId).First())
  41. .Where(x => x.Enabled)
  42. .OrderBy(x => x.SortNo)
  43. .ThenBy(x => x.MetricCode)
  44. .ToList();
  45. var result = new AdoS8MonitorOptionsResultDto();
  46. foreach (var obj in resolvedObjects)
  47. {
  48. var metrics = resolvedMetrics
  49. .Where(m => m.ObjectCode == obj.ObjectCode)
  50. .Select(m => new AdoS8MonitorMetricOptionDto
  51. {
  52. MetricCode = m.MetricCode,
  53. MetricLabel = m.MetricName,
  54. Mechanism = m.Mechanism,
  55. Unit = m.Unit,
  56. DueAtField = m.DueAtField,
  57. StatusField = m.StatusField,
  58. MeasuredValueField = m.MeasuredValueField,
  59. ObjectIdField = m.ObjectIdField,
  60. ObjectCodeField = m.ObjectCodeField,
  61. ObjectNameField = m.ObjectNameField,
  62. IsResultKpi = m.IsResultKpi,
  63. })
  64. .ToList();
  65. // 仅返回有 enabled metric 的 object
  66. if (metrics.Count == 0) continue;
  67. var mechanisms = metrics
  68. .Select(x => x.Mechanism)
  69. .Where(s => !string.IsNullOrWhiteSpace(s))
  70. .Distinct()
  71. .ToList();
  72. result.Objects.Add(new AdoS8MonitorObjectOptionDto
  73. {
  74. ObjectCode = obj.ObjectCode,
  75. ObjectType = obj.ObjectType,
  76. ObjectLabel = obj.ObjectName,
  77. SourceTable = obj.SourceTable,
  78. Mechanisms = mechanisms,
  79. Metrics = metrics,
  80. });
  81. }
  82. return result;
  83. }
  84. }