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;
}
}