| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- using Admin.NET.Plugin.AiDOP.Dto.S8;
- using Admin.NET.Plugin.AiDOP.Entity.S8;
- namespace Admin.NET.Plugin.AiDOP.Service.S8;
- /// <summary>
- /// S8 监控对象/指标只读字典服务。
- /// 合并策略:baseline (tenant_id=0/factory_id=0) + 当前 tenant/factory 覆盖;按 object_code/metric_code 去重。
- /// 仅返回 enabled=true 的对象与指标,且只返回有 enabled metric 的 object。
- /// </summary>
- public class S8MonitorDictionaryService : ITransient
- {
- private readonly SqlSugarRepository<AdoS8MonitorObject> _objectRep;
- private readonly SqlSugarRepository<AdoS8MonitorMetric> _metricRep;
- public S8MonitorDictionaryService(
- SqlSugarRepository<AdoS8MonitorObject> objectRep,
- SqlSugarRepository<AdoS8MonitorMetric> metricRep)
- {
- _objectRep = objectRep;
- _metricRep = metricRep;
- }
- public async Task<AdoS8MonitorOptionsResultDto> 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;
- }
- }
|