using Admin.NET.Plugin.AiDOP.Dto.S8; using Admin.NET.Plugin.AiDOP.Entity.S8; namespace Admin.NET.Plugin.AiDOP.Service.S8; /// /// S8 监控对象/指标只读字典服务。 /// 合并策略:baseline (tenant_id=0/factory_id=0) + 当前 tenant/factory 覆盖;按 object_code/metric_code 去重。 /// 仅返回 enabled=true 的对象与指标,且只返回有 enabled metric 的 object。 /// public class S8MonitorDictionaryService : ITransient { private readonly SqlSugarRepository _objectRep; private readonly SqlSugarRepository _metricRep; public S8MonitorDictionaryService( SqlSugarRepository objectRep, SqlSugarRepository metricRep) { _objectRep = objectRep; _metricRep = metricRep; } public async Task GetOptionsAsync(long tenantId, long factoryId) { var allObjects = await _objectRep.AsQueryable() .Where(x => (x.TenantId == 0 && x.FactoryId == 0) || (x.TenantId == tenantId && x.FactoryId == factoryId)) .ToListAsync(); var allMetrics = await _metricRep.AsQueryable() .Where(x => (x.TenantId == 0 && x.FactoryId == 0) || (x.TenantId == tenantId && x.FactoryId == factoryId)) .ToListAsync(); // tenant/factory 覆盖 baseline:同 object_code 优先取 tenant 行;同 metric_code 优先取 tenant 行。 var resolvedObjects = allObjects .GroupBy(x => x.ObjectCode) .Select(g => g.OrderByDescending(x => x.FactoryId).ThenByDescending(x => x.TenantId).First()) .Where(x => x.Enabled) .OrderBy(x => x.SortNo) .ThenBy(x => x.ObjectCode) .ToList(); var resolvedMetrics = allMetrics .GroupBy(x => x.MetricCode) .Select(g => g.OrderByDescending(x => x.FactoryId).ThenByDescending(x => x.TenantId).First()) .Where(x => x.Enabled) .OrderBy(x => x.SortNo) .ThenBy(x => x.MetricCode) .ToList(); var result = new AdoS8MonitorOptionsResultDto(); foreach (var obj in resolvedObjects) { var metrics = resolvedMetrics .Where(m => m.ObjectCode == obj.ObjectCode) .Select(m => new AdoS8MonitorMetricOptionDto { MetricCode = m.MetricCode, MetricLabel = m.MetricName, Mechanism = m.Mechanism, Unit = m.Unit, DueAtField = m.DueAtField, StatusField = m.StatusField, MeasuredValueField = m.MeasuredValueField, ObjectIdField = m.ObjectIdField, ObjectCodeField = m.ObjectCodeField, ObjectNameField = m.ObjectNameField, IsResultKpi = m.IsResultKpi, }) .ToList(); // 仅返回有 enabled metric 的 object if (metrics.Count == 0) continue; var mechanisms = metrics .Select(x => x.Mechanism) .Where(s => !string.IsNullOrWhiteSpace(s)) .Distinct() .ToList(); result.Objects.Add(new AdoS8MonitorObjectOptionDto { ObjectCode = obj.ObjectCode, ObjectType = obj.ObjectType, ObjectLabel = obj.ObjectName, SourceTable = obj.SourceTable, Mechanisms = mechanisms, Metrics = metrics, }); } return result; } }